【问题标题】:CruiseControl.net, msbuild, /p:OutputPath and CCNetArtifactDirectoryCruiseControl.net、msbuild、/p:OutputPath 和 CCNetArtifactDirectory
【发布时间】:2008-08-03 21:25:09
【问题描述】:

我目前正在尝试设置 CruiseControl.net。到目前为止,它运行良好,但我的 MSBuild 任务有问题。

根据Documentation,它将CCNetArtifactDirectory 传递给MSBuild。但是如何使用呢?

我试过了:

<buildArgs>
   /noconsolelogger /p:OutputPath=$(CCNetArtifactDirectory)\test
</buildArgs>

但这不起作用。事实上,它会用这个错误杀死服务:

ThoughtWorks.CruiseControl.Core.Config.Preprocessor.EvaluationException:引用未知符号 CCNetArtifactDirectory

文档相当稀疏,google und 主要提供修改 .sln 项目文件,这是我想要避免的,以便以后能够手动构建这个项目 - 我真的更喜欢/p:OutputPath

【问题讨论】:

    标签: msbuild cruisecontrol.net


    【解决方案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 脚本本身中使用工件目录变量。这是我现在如何从我的 CC.Net MSBuild 脚本运行 FxCop 的示例(此脚本是 CC.Net 指向的 - 脚本中还有一个“构建”目标,其中包括针对 SLN 的 MSBuild 任务进行实际编译):

      <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>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-07
          • 1970-01-01
          相关资源
          最近更新 更多