Skip to content

Instantly share code, notes, and snippets.

@distantcam
Last active February 11, 2026 09:36
Show Gist options
  • Select an option

  • Save distantcam/93a7852dae1b47cd64790b021aa92ac5 to your computer and use it in GitHub Desktop.

Select an option

Save distantcam/93a7852dae1b47cd64790b021aa92ac5 to your computer and use it in GitHub Desktop.
Tailwind MSBuild Script for ASPNetCore

Simply add Tailwind.targets to your project with the following line.

<Import Project="Tailwind.targets" />

The scripts will look for any .css files in a Styles/ root folder of your project, and add them to the static assets during build.

<Project>
<Target Name="DetectLddVersion" BeforeTargets="DownloadTailwind" Condition="$([System.OperatingSystem]::IsLinux())">
<Exec Command="ldd --version"
ConsoleToMsBuild="true"
EchoOff="true"
IgnoreExitCode="true"
StandardOutputImportance="Low"
StandardErrorImportance="Low">
<Output TaskParameter="ConsoleOutput" PropertyName="LddVersion" />
</Exec>
<PropertyGroup>
<IsMusl Condition="'$(LddVersion)' != '' And $(LddVersion.Contains('musl'))">true</IsMusl>
</PropertyGroup>
</Target>
<Target Name="DownloadTailwind">
<PropertyGroup>
<_TailwindVersion Condition=" '$(TailwindVersion)' == '' ">latest</_TailwindVersion>
<_TailwindVersion Condition=" '$(TailwindVersion)' != '' ">$(TailwindVersion)</_TailwindVersion>
<!-- Determine which version of Tailwind to use based on the current OS & architecture -->
<TailwindReleaseName Condition="$([System.OperatingSystem]::IsLinux()) And '$(IsMusl)' == '' And $([System.Runtime.InteropServices.RuntimeInformation]::OSArchitecture) == X64">tailwindcss-linux-x64</TailwindReleaseName>
<TailwindReleaseName Condition="$([System.OperatingSystem]::IsLinux()) And '$(IsMusl)' == '' And $([System.Runtime.InteropServices.RuntimeInformation]::OSArchitecture) == Arm64">tailwindcss-linux-arm64</TailwindReleaseName>
<TailwindReleaseName Condition="$([System.OperatingSystem]::IsLinux()) And '$(IsMusl)' == 'true' And $([System.Runtime.InteropServices.RuntimeInformation]::OSArchitecture) == X64">tailwindcss-linux-x64-musl</TailwindReleaseName>
<TailwindReleaseName Condition="$([System.OperatingSystem]::IsLinux()) And '$(IsMusl)' == 'true' And $([System.Runtime.InteropServices.RuntimeInformation]::OSArchitecture) == Arm64">tailwindcss-linux-arm64-musl</TailwindReleaseName>
<TailwindReleaseName Condition="$([System.OperatingSystem]::IsMacOS()) And $([System.Runtime.InteropServices.RuntimeInformation]::OSArchitecture) == X64">tailwindcss-macos-x64</TailwindReleaseName>
<TailwindReleaseName Condition="$([System.OperatingSystem]::IsMacOS()) And $([System.Runtime.InteropServices.RuntimeInformation]::OSArchitecture) == Arm64">tailwindcss-macos-arm64</TailwindReleaseName>
<TailwindReleaseName Condition="$([System.OperatingSystem]::IsWindows()) And $([System.Runtime.InteropServices.RuntimeInformation]::OSArchitecture) == X64">tailwindcss-windows-x64.exe</TailwindReleaseName>
<TailwindReleaseName Condition="$([System.OperatingSystem]::IsWindows()) And $([System.Runtime.InteropServices.RuntimeInformation]::OSArchitecture) == Arm64">tailwindcss-windows-arm64.exe</TailwindReleaseName>
<TailwindDownloadUrl Condition="'$(TailwindDownloadUrl)' == '' And $(_TailwindVersion) != 'latest'">https://github.com/tailwindlabs/tailwindcss/releases/download/$(TailwindVersion)/$(TailwindReleaseName)</TailwindDownloadUrl>
<TailwindDownloadUrl Condition="'$(TailwindDownloadUrl)' == '' And $(_TailwindVersion) == 'latest'">https://github.com/tailwindlabs/tailwindcss/releases/latest/download/$(TailwindReleaseName)</TailwindDownloadUrl>
</PropertyGroup>
<!-- Download the file if it hasn't been already -->
<!-- Note: Using latest will always reach out to GitHub to see if a new version is available -->
<DownloadFile DestinationFolder="$(BaseIntermediateOutputPath)tailwind\$(_TailwindVersion)"
DestinationFileName="$(TailwindReleaseName)"
SourceUrl="$(TailwindDownloadUrl)"
SkipUnchangedFiles="true"
Retries="3"
Condition="'$(_TailwindVersion)' == 'latest' Or !Exists('$(TailwindCliPath)')">
<Output TaskParameter="DownloadedFile" PropertyName="TailwindCliPath" />
</DownloadFile>
<!-- On unix systems, make the file executable -->
<Exec
Condition="Exists('$(TailwindCliPath)') And ($([System.OperatingSystem]::IsLinux()) Or $([System.OperatingSystem]::IsMacOS()))"
Command="chmod +x '$(TailwindCliPath)'"
EchoOff="true" />
</Target>
<Target Name="ResolveTailwindAssetOutputs">
<ItemGroup>
<_TailwindAsset Include="@(None)" Condition="'%(Extension)' == '.css' And $([System.String]::Copy('%(RecursiveDir)').StartsWith('Styles\'))">
<OutputFile>$(IntermediateOutputPath)%(RecursiveDir)%(FileName)%(Extension)</OutputFile>
</_TailwindAsset>
</ItemGroup>
<ItemGroup>
<UpToDateCheckInput Include="%(_TailwindAsset.Identity)" Set="Css" />
<UpToDateCheckBuilt Include="%(_TailwindAsset.OutputFile)" Original="%(_TailwindAsset.Identity)" Set="Css" />
</ItemGroup>
</Target>
<Target Name="BuildTailwindAssets" DependsOnTargets="DownloadTailwind;ResolveTailwindAssetOutputs">
<Exec Command="$(TailwindCliPath) -i @(_TailwindAsset) -o %(OutputFile)" Condition="'$(Optimize)' == 'false'" />
<Exec Command="$(TailwindCliPath) -i @(_TailwindAsset) -o %(OutputFile) --minify" Condition="'$(Optimize)' == 'true'" />
<ItemGroup>
<FileWrites Include="%(_TailwindAsset.OutputFile)" />
</ItemGroup>
</Target>
<Target Name="ResolveTailwindStaticWebAsset" Condition="'$(NoBuild)' != 'true'"
BeforeTargets="AssignTargetPaths"
DependsOnTargets="ResolveStaticWebAssetsConfiguration;BuildTailwindAssets">
<DefineStaticWebAssets
CandidateAssets="%(_TailwindAsset.OutputFile)"
RelativePathPattern="$(IntermediateOutputPath)%(_TailwindAsset.RelativeDir)**"
SourceType="Discovered"
SourceId="$(PackageId)"
ContentRoot="$(IntermediateOutputPath)%(_TailwindAsset.RelativeDir)"
BasePath="$(StaticWebAssetBasePath)">
<Output TaskParameter="Assets" ItemName="StaticWebAsset" />
<Output TaskParameter="Assets" ItemName="_CurrentProjectStaticWebAsset" />
</DefineStaticWebAssets>
<DefineStaticWebAssetEndpoints
CandidateAssets="@(_CurrentProjectStaticWebAsset)"
ContentTypeMappings="@(StaticWebAssetContentTypeMapping)"
>
<Output TaskParameter="Endpoints" ItemName="StaticWebAssetEndpoint" />
</DefineStaticWebAssetEndpoints>
</Target>
</Project>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment