.NET プロジェクト公開:クライアント別のファイル動的除外・追加
本記事では、.NET プロジェクトでクライアントのパラメータに応じて、公開時にファイルを動的に除外・追加する方法を紹介します。複数クライアント向けのカスタマイズ公開に便利です。
MSites のプロジェクト公開スクリプトを作成する際、クライアント名を公開パラメータとして指定することで、クライアント固有のスタイル、リソース、アイコンなどのファイルを、最終的な Release パッケージに動的に含めることができます。
ただし、このバージョンでは静的ファイルやスタイルファイルのみを処理しており、プロジェクトに含まれるコードやコンポーネントファイルは処理されません。 そのため、クライアントごとにカスタマイズされたコンポーネントが他のクライアント版に誤って含まれてしまう問題があります。 これを解決するには、.NET プログラムの編集時に設定ファイルに従って一部のファイルを除外する必要があります。 実現方法は簡単で、.csproj にクライアント固有の build.targets を動的にインポートすればよいです。
ディレクトリ構成例
sites/
├─ customA/
├─ customB/
src/
└─ Web/
web.csproj
クライアント build.targets の例
sites/customX/build.targets に除外するファイルを列挙します:
<Project>
<ItemGroup>
...
<Compile Remove="Views\Shared\Components\Breadcrumb\Blog.cshtml" />
<None Remove="Views\Shared\Components\Breadcrumb\Blog.cshtml" />
...
</ItemGroup>
</Project>注意:
- Compile:コンパイル対象のファイル
- Content:コンテンツファイル
- None:その他のファイル
最も簡単な方法は、Visual Studio で手動でファイルを除外し、その後 .csproj をテキストエディタで開いて、該当する ItemGroup を build.targets にコピーすることです。
.csproj 設定例
<project sdk="Microsoft.NET.Sdk.Web">
<propertygroup>
<!-- デフォルトクライアント -->
<client condition="'$(Client)' == ''">default</client>
<!-- クライアント設定ファイルパス -->
<clientconfig>../../sites/$(Client)/build.targets</clientconfig>
</propertygroup>
<!-- クライアント固有設定を動的にインポート -->
<import project="$(ClientConfig)" condition="Exists('$(ClientConfig)')">
</import></project>
注意点:
ClientConfigのパスが正しいことを確認してください。$(Client)の値は、公開時にパラメータとして指定されます。
公開コマンド例
dotnet publish -c Release -o "d:/publish/felixblog" --self-contained false --verbosity minimal -p:IsProduction=true -p:Client=felixblog
これにより、公開時に sites/felixblog/build.targets にリストされたファイルが動的に含まれたり除外されたりし、複数クライアントのプロジェクト管理が非常に便利になります。