この問題の回避策は、MSBuild プロセスをカスタマイズして、"Target Framework Moniker Assembly Attributes" ファイル (質問に記載されているファイルの適切な名前) が作成されるパスを設定することです。
TargetFrameworkMonikerAssemblyAttributesPath
プロパティは Microsoft.Common.targets で定義され、ファイルを作成する場所を決定します。このプロパティをオーバーライドすることで、別の場所を使用するように場所を変更できます。
適切な置換を実現するために使用できるスクリプトを次に示します。
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<PrepareForBuildDependsOn>
$(PrepareForBuildDependsOn);
_SetTargetFrameworkMonikerAssemblyAttributesPath
</PrepareForBuildDependsOn>
</PropertyGroup>
<Target
Name="_SetTargetFrameworkMonikerAssemblyAttributesPath"
Condition="'$(TEAMCITY_VERSION)' != ''">
<PropertyGroup>
<TargetFrameworkMonikerAssemblyAttributesDir
Condition="'$(TargetFrameworkMonikerAssemblyAttributesDir)' == ''">
$([MSBuild]::GetRegistryValue("HKEY_CURRENT_USER\Environment", "TMP"))
</TargetFrameworkMonikerAssemblyAttributesDir>
<TargetFrameworkMonikerAssemblyAttributesDir
Condition="'$(TargetFrameworkMonikerAssemblyAttributesDir)' == ''">
$([MSBuild]::GetRegistryValue("HKEY_CURRENT_USER\Environment", "TEMP"))
</TargetFrameworkMonikerAssemblyAttributesDir>
<TargetFrameworkMonikerAssemblyAttributesDir
Condition="'$(TargetFrameworkMonikerAssemblyAttributesDir)' == ''">
$(USERPROFILE)
</TargetFrameworkMonikerAssemblyAttributesDir>
<TargetFrameworkMonikerAssemblyAttributesDir
Condition="'$(TargetFrameworkMonikerAssemblyAttributesDir)' == ''">
$([System.IO.Path]::Combine('$(WINDIR)', 'Temp'))
</TargetFrameworkMonikerAssemblyAttributesDir>
<TargetFrameworkMonikerAssemblyAttributesPath>
$([System.IO.Path]::Combine('$(TargetFrameworkMonikerAssemblyAttributesDir)','$(TargetFrameworkMoniker).AssemblyAttributes$(DefaultLanguageSourceExtension)'))
</TargetFrameworkMonikerAssemblyAttributesPath>
</PropertyGroup>
<Message Text="Target Framework Moniker Assembly Attributes path is "$(TargetFrameworkMonikerAssemblyAttributesPath)"" Importance="low" />
</Target>
ターゲットはTEAMCITY_VERSION
、がプロパティとして指定されている場合にのみ実行されます。これは、TeamCity エージェントによってビルドが実行されている場合にのみ実行されます。
注:の子要素はPropertyGroup
それぞれ 1 行にする必要があります。ここでは、読みやすくするために複数行に分けていますが、追加の改行によりスクリプトが失敗します。
ターゲットが実行されると、レジストリで定義されているユーザーの環境変数に基づいて適切なパスを作成しようとします。最初にTMP
とTEMP
を検索してから、ユーザーのプロファイル フォルダーに戻り、最後にC:\Windows\Temp
ディレクトリに戻ります。これは、System.Path.GetTempPath() で文書化されている順序と一致し、TeamCity の外部での MSBuild の実行と一致する動作になるはずです。
これは、システムのどこかに .targets ファイルとして保存し、<Import>
要素を使用して、TeamCity サーバーによってビルドされているプロジェクトの .csproj ファイルにインポートする必要があります。MSBuild 拡張機能ディレクトリ ( C:\Program Files\MSBuild\
) の下にスクリプトを追加し、次のインポート要素を追加して参照しました。
<Import Project="$(MSBuildExtensionsPath)\TeamCity\TeamCity.Incremental.targets" />
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
Import 要素の場所/順序は問題ではありませんが、すべての .csproj ファイルに表示される whichの後に含めることをお勧めします。