CruiseControl.net、msbuild、/p:OutputPath、CCNetArtifactDirectory
-
08-06-2019 - |
質問
現在、CruiseControl.netをセットアップしようとしています。ここまでは問題なく動作していますが、MSBuild タスクに問題があります。
による ドキュメンテーション, 、CCNetArtifactDirectory を MSBuild に渡します。でも、どうやって使えばいいのでしょうか?
私はこれを試してみました:
<buildArgs>
/noconsolelogger /p:OutputPath=$(CCNetArtifactDirectory)\test
</buildArgs>
しかし、それはうまくいきません。実際、次のエラーが発生してサービスが強制終了されます。
ThoughtWorks.CruiseControl.Core.Config.Preprocessor.EvaluationException:不明なシンボル CCNetArtifactDirectory への参照
ドキュメントはかなり希薄で、Google では主に .sln プロジェクト ファイルの変更を提供しています。これは、後でこのプロジェクトを手動でビルドできるようにするために避けたいことです。私はそれを本当に好みます。 /p:OutputPath
.
解決
CCNetArtifactDirectory はデフォルトで MSBuild に渡されるため、心配する必要はありません。MSBuild は、指定した作業ディレクトリに関連する「ビンの場所」にビルド出力を配置します。
<executable>c:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe</executable>
<workingDirectory>C:\data\projects\FooSolution\</workingDirectory>
<projectFile>FooSolution.sln</projectFile>
<buildArgs>/noconsolelogger /p:Configuration=Debug </buildArgs>
したがって、上記の例では、ビルド出力は C:\data\projects\FooSolution[ProjectName]\bin\Debug に配置されます。別の場所に出力したい場合は、CCNET のタグを確認してください。
<publishers>
<xmllogger />
<buildpublisher>
<sourceDir>C:\data\projects\FooSolution\FooProject\bin\Debug</sourceDir>
<publishDir>C:\published\FooSolution\</publishDir>
<useLabelSubDirectory>false</useLabelSubDirectory>
</buildpublisher>
</publishers>
これにより、出力を別の場所に公開できるようになります。
他のヒント
MSBuild スクリプト自体の内部でアーティファクト ディレクトリ変数を使用できます。これは、現在 CC.Net MSBuild スクリプトから FxCop を実行している方法の例です (このスクリプトは CC.Net が指すものです。スクリプトには、SLN に対する MSBuild タスクを含む「Build」ターゲットもあります)。実際のコンパイルを実行します):
<Exec
Command='FxCopCmd.exe /project:"$(MSBuildProjectDirectory)\FXCopRules.FxCop" /out:"$(CCNetArtifactDirectory)\ProjectName.FxCop.xml"'
WorkingDirectory="C:\Program Files\Microsoft FxCop 1.35"
ContinueOnError="true"
IgnoreExitCode="true"
/>
パラメータのようなもの CCNetArtifactDirectory
環境変数を使用して外部プログラムに渡されます。外部プログラムでは利用可能ですが、内部にはありません CCNET
構成。これはしばしば混乱を引き起こします。
代わりにプリプロセッサ定数を使用できます。
<cb:define project.artifactDirectory="C:\foo">
<project>
<!-- [...] -->
<artifactDirectory>$(project.artifactDirectory)</artifactDirectory>
<!-- [...] -->
<tasks>
<!-- [...] -->
<msbuild>
<!-- [...] -->
<buildArgs>/noconsolelogger /p:OutputPath=$(project.artifactDirectory)\test</buildArgs>
<!-- [...] -->
</msbuild>
<!-- [...] -->
</tasks>
<!-- [...] -->
</project>