You can pass build parameter to msbuild through dotnet build
or dotnet publish
Use $((MSBuildRuntimeType)
. This will return Full | Core | Mono
.
.NET Core MSBuild cannot load tasks built against MSBuild 4.0 #2111
https://docs.microsoft.com/en-us/visualstudio/msbuild/msbuild-conditions
https://docs.microsoft.com/ja-jp/visualstudio/msbuild/msbuild-reserved-and-well-known-properties
https://docs.microsoft.com/en-us/visualstudio/msbuild/common-msbuild-project-properties
BeforeTargets and AfterTargets are much prefer because it can handle like Condition. Hey, what's MSBuild 4? We are living in MSBuild 15.0!
You cannot use [abc]*
to pickup "ahoge", "bhoge", "choge". It doesn't work at all.
Better using . separator for DependentUpon
like items.
Docker? Dockerfile
, Dockerfile.dev
, Dockerfile.release
, .dockerignore
will be sum up automatically with this naming rule.
Make your own RemoveDir MSBuild Task like following. It should run After Build & Before Publish
<!-- Clean PublishDir task -->
<Target Name="CleanPublishArtifact" AfterTargets="Build">
<PropertyGroup>
<CleanPath>$([System.IO.Path]::Combine($(MSBuildThisFileDirectory),$(PublishDir)))</CleanPath>
</PropertyGroup>
<RemoveDir Directories="$(CleanPath)" />
</Target>
Use <MSBuild Projects="$(MsBuildThisFile)" Targets="SwapConfig" Properties="YourUniqueProperty=AndValueXxx"/>
to make your call unique!
<PropertyGroup>
<!--app-->
<SwapFileName></SwapFileName>
<!--config-->
<SwapExtension></SwapExtension>
<!--$(MSBuildThisFileDirectory)-->
<SwapDestinationDir></SwapDestinationDir>
</PropertyGroup>
<Target Name="SwapConfig">
<PropertyGroup>
<CopyConfigMessage>BranchName build parameter missing! Skipping $(SwapFileName).$(SwapExtension) swap task.</CopyConfigMessage>
<CopyConfigDestination>$([System.IO.Path]::Combine($(SwapDestinationDir), $(SwapFileName).$(SwapExtension)))</CopyConfigDestination>
</PropertyGroup>
<PropertyGroup Condition="'$(BranchName)' != '' AND Exists('$(MSBuildThisFileDirectory)$(SwapFileName).$(BranchName).$(SwapExtension)')">
<!-- For "dotnet build|publish -c Debug /p:BranchName=Xxxx" where xxx.BranchName.config exists -->
<CopyConfigMessage>Detected BranchName parameter, Copy $(SwapFileName).$(BranchName).$(SwapExtension) to $(SwapFileName).$(SwapExtension)</CopyConfigMessage>
<CopyConfigSource>$(MSBuildThisFileDirectory)$(SwapFileName).$(BranchName).$(SwapExtension)</CopyConfigSource>
</PropertyGroup>
<PropertyGroup Condition="'$(BranchName)' != '' AND !Exists('$(MSBuildThisFileDirectory)$(SwapFileName).$(BranchName).$(SwapExtension)')">
<!-- For "dotnet build|publish -c Debug /p:BranchName=Xxxx" where xxx.BranchName.config NOT exists -->
<Fallback>Development</Fallback>
<CopyConfigMessage>Detected BranchName parameter, $(SwapFileName).$(BranchName).$(SwapExtension) missing! Copy $(SwapFileName).$(Fallback).$(SwapExtension) to $(SwapFileName).$(SwapExtension)</CopyConfigMessage>
<CopyConfigSource>$(MSBuildThisFileDirectory)$(SwapFileName).$(Fallback).$(SwapExtension)</CopyConfigSource>
</PropertyGroup>
<PropertyGroup Condition="'$(BranchName)' == '' AND Exists('$(MSBuildThisFileDirectory)$(SwapFileName).$(Configuration).$(SwapExtension)')">
<!-- For dotnet build|publish without /p:BranchName=Xxxx -->
<CopyConfigMessage>Missing BranchName parameter! Copy $(SwapFileName).$(Configuration).$(SwapExtension) to $(SwapFileName).$(SwapExtension)</CopyConfigMessage>
<CopyConfigSource>$(MSBuildThisFileDirectory)$(SwapFileName).$(Configuration).$(SwapExtension)</CopyConfigSource>
</PropertyGroup>
<Message Importance="High" Text="@SwapConfig@ [$(SwapFileName).$(SwapExtension)] $(CopyConfigMessage)" />
<Message Importance="High" Text="* CopyConfigSource : $(CopyConfigSource)" />
<Message Importance="High" Text="* CopyConfigDestination : $(CopyConfigDestination)" />
<Copy SourceFiles="$(CopyConfigSource)" DestinationFiles="$(CopyConfigDestination)" />
</Target>
Then just call it from any Target you want. CallTargets
or MSBuild
task is simple enough. If you want to pass parameter or call multiple time, then use MSBuild.
<Target Name="BeforeBuildHeader" BeforeTargets="Build">
<Message Importance="High" Text="======================================================" />
<Message Importance="High" Text="[Before Build Custom Task]" />
<Message Importance="High" Text="* MSBuildRuntimeType : $(MSBuildRuntimeType)" />
<Message Importance="High" Text="* MSBuildThisFileDirectory : $(MSBuildThisFileDirectory)" />
<Message Importance="High" Text="* Configuration : $(Configuration)" />
<Message Importance="High" Text="* BranchName : $(BranchName)" />
<MSBuild Projects="$(MsBuildThisFile)" Targets="SwapConfig" Properties="SwapFileName=app;SwapExtension=config;SwapDestinationDir=$(MSBuildThisFileDirectory)"/>
</Target>
Picture store