CruiseControl.net, msbuild,/p: OutputPath и CCNetArtifactDirectory
Я пытаюсь настроить CruiseControl.net на данный момент. Пока это работает хорошо, но у меня есть проблема с задачей MSBuild.
В соответствии с Документация, он передает CCNetArtifactDirectory в MSBuild. Но как его использовать?
Я пробовал это:
<buildArgs>
/noconsolelogger /p:OutputPath=$(CCNetArtifactDirectory)\test
</buildArgs>
Но это не работает. Фактически, он убивает службу с помощью этой ошибки:
ThoughtWorks.CruiseControl.Core.Config.Preprocessor.EvaluationException: ссылка на неизвестный символ CCNetArtifactDirectory
Документация довольно скудная, а google и в основном предлагает изменить файл проекта .sln Project, чего я хочу избежать, чтобы впоследствии создать этот проект вручную - я бы предпочел /p:OutputPath
.
Ответы
Ответ 1
CCNetArtifactDirectory передается в MSBuild по умолчанию, поэтому вам не нужно беспокоиться об этом. MSBuild поместит вывод сборки в ячейку "bin", относящуюся к указанному вами рабочему каталогу.
<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>
Это позволит вам публиковать свой вывод в другом месте.
Ответ 2
Вы можете использовать переменную каталога артефакта внутри самого MSBuild script. Вот пример того, как я запускаю FxCop прямо сейчас из моего CC.Net MSBuild script (этот script - это то, что указывает CC.Net) - в script есть цель "Build", которая включает в себя Задача MSBuild против SLN выполнить фактическую компиляцию):
<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"
/>
Ответ 3
Параметры, такие как 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>