はじめに
今回はMSBuildでdotnet build
が終了した後にdllを特定の場所にコピーする方法を紹介したいと思います。
特にUnityの場合では、Roslyn Analyzer
やSourceGenerator
を利用する場合は手作業でdllをコピーするのはとても面倒です。そんなときはMS Buildで自動化しちゃいましょう。
やり方
.csproj
に以下を追加します。
<Target Name="DllCopy" AfterTargets="AfterBuild"> <Copy SourceFiles="$(OutputPath)/Hoge.dll" DestinationFolder="$(MSBuildThisFileDirectory)" /> </Target>
AfterTargets
でAfterBuild
を指定することで、dotnet build
を走らせたときにビルド後に処理が走ります。Copy
のSourceFiles
でコピー元のdllを指定して、DestinationFolder
に出力先のフォルダを指定します。
↓ 実際に組み込んだ例
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>netstandard2.0</TargetFramework> <IsPackable>false</IsPackable> <Nullable>enable</Nullable> <LangVersion>latest</LangVersion> <EnforceExtendedAnalyzerRules>true</EnforceExtendedAnalyzerRules> <IsRoslynComponent>true</IsRoslynComponent> <RootNamespace>SourceGenerators</RootNamespace> <PackageId>SourceGenerators</PackageId> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.4"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> </PackageReference> <PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.3.0"/> <PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="4.3.0"/> </ItemGroup> <!-- dllをUnity配下に出力する --> <Target Name="DllCopy" AfterTargets="AfterBuild"> <Message Text="OutputPath : $(OutputPath)" Importance="high" /> <Message Text="MSBuildThisFileDirectory : $(MSBuildThisFileDirectory)" Importance="high" /> <Copy SourceFiles="$(OutputPath)/SourceGenerators.dll" DestinationFolder="$(MSBuildThisFileDirectory)../../../SourceGeneratorSandbox.Unity/Assets/SourceGenerators" /> </Target> </Project>
共通のプロパティおよびパラメーター
ちなみに$(OutputPath)
や$(MSBuildThisFileDirectory)
はMS Buildが自動で設定してくれる値のことです。
learn.microsoft.com
learn.microsoft.com
実際にどんな値が組み込まれているか知りたい場合はMessage
を利用すると良いでしょう。
- OutputPath : プロジェクト ディレクトリから出力ディレクトリへの相対パス。例.
bin/Debug/netstandard2.0/
- MSBuildThisFileDirectory :
.csproj
が置かれているフォルダへのパス