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는 사용자가 지정한 작업 디렉터리와 관련된 "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>
이렇게 하면 출력을 다른 위치에 게시할 수 있습니다.
다른 팁
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>