はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【C#】MSBuildでdotnet buildが終了したあとにdllを特定の場所にコピーする方法

はじめに

今回はMSBuildでdotnet buildが終了した後にdllを特定の場所にコピーする方法を紹介したいと思います。

特にUnityの場合では、Roslyn AnalyzerSourceGeneratorを利用する場合は手作業でdllをコピーするのはとても面倒です。そんなときはMS Buildで自動化しちゃいましょう。

やり方

.csprojに以下を追加します。

<Target Name="DllCopy" AfterTargets="AfterBuild">
    <Copy SourceFiles="$(OutputPath)/Hoge.dll" DestinationFolder="$(MSBuildThisFileDirectory)" />
</Target>

AfterTargetsAfterBuildを指定することで、dotnet buildを走らせたときにビルド後に処理が走ります。CopySourceFilesでコピー元の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が置かれているフォルダへのパス