はじめに
今回は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が置かれているフォルダへのパス