如何解决CruiseControl.NET中<msbuild>任务中的“只能指定一个项目”错误

6

我正在尝试使用CruiseControl.NET版本1.3.0.2918中的任务,这个任务相当简单:

  <project name="AppBuilder 1.0 (Debug)">
    <workingDirectory>c:\depot\AppBuilder\1.0\</workingDirectory>
    <triggers/>
    <tasks>
      <msbuild/>
    </tasks>
   </project>

然而,当运行项目时,构建日志中出现以下信息导致失败:

MSBUILD:错误 MSB1008:只能指定一个项目。开关:1.0

有关开关语法,请键入“MSBuild /help”

查看ccnet.log文件后发现以下内容:

在工作目录[c:\depot\AppBuilder\1.0]中使用参数[/nologo "/p:CCNetArtifactDirectory=C:\Program Files\CruiseControl.NET\server\AppBuilder 1.0 (Debug)\Artifacts;CCNetBuildCondition=ForceBuild;CCNetBuildDate=2009-01-22;CCNetBuildTime=09:25:55;CCNetIntegrationStatus=Unknown;CCNetLabel=3; CCNetLastIntegrationStatus=Failure;CCNetNumericLabel=3;CCNetProject=AppBuilder 1.0 (Debug);CCNetProjectUrl=http://CISERVER01/ccnet;CCNetRequestSource=jstong; CCNetWorkingDirectory=c:\depot\AppBuilder\1.0\" "/l:ThoughtWorks.CruiseControl.MsBuild.XmlLogger,ThoughtWorks.CruiseControl.MsBuild.dll;C:\Program Files\CruiseControl.NET\server\AppBuilder 1.0 (Debug)\Artifacts\msbuild-results.xml"]开始进程[C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\MSBuild.exe]

由此推断出在正确的工作目录下运行了msbuild,并将命令行传递给它:

/nologo "/p:CCNetArtifactDirectory=C:\Program Files\CruiseControl.NET\server\AppBuilder 1.0 (Debug)\Artifacts;CCNetBuildCondition=ForceBuild;CCNetBuildDate=2009-01-22;CCNetBuildTime=09:25:55;CCNetIntegrationStatus=Unknown;CCNetLabel=3; CCNetLastIntegrationStatus=Failure;CCNetNumericLabel=3;CCNetProject=AppBuilder 1.0 (Debug);CCNetProjectUrl=http://CISERVER01/ccnet;CCNetRequestSource=jstong; CCNetWorkingDirectory=c:\depot\AppBuilder\1.0\" "/l:ThoughtWorks.CruiseControl.MsBuild.XmlLogger,ThoughtWorks.CruiseControl.MsBuild.dll;C:\Program Files\CruiseControl.NET\server\AppBuilder 1.0 (Debug)\Artifacts\msbuild-results.xml"

如果手动在命令行中运行此命令,将会得到类似的错误。
我认为,ccnet没有向MSBuild可执行文件传递正确的命令行。

你能发现我的错误吗?或者这个版本的CruiseControl.NET(1.3.0.2918)在任务方面出了问题吗?


没有看到你实际的 MSBuild 任务块,就无法进行诊断。 - Alex
4个回答

28

我认为可能是你在工件目录路径中的空格。MSBuild 不喜欢空格,因为它会将其视为参数之间的分隔符。你可以尝试从该路径中移除空格并查看结果。


Alex,你肯定有所发现。看起来是参数列表的最后一部分(“/l:...”)让MSBuild感到困惑。我总是让cc.net选择构件目录。我猜这是某个配置属性? - Jeff Stong
在评论中回答自己的问题--似乎可以使用<project>中的<artifactDirectory>来控制这个。 - Jeff Stong
2
问题似乎不仅在于构件目录路径中的空格,而且还在于记录器路径中的空格。一旦我消除了这些问题,事情似乎就正常了。我将为此答案点赞并将其标记为已接受的答案--感谢您的帮助。 - Jeff Stong
MSBuild绝对不喜欢空格。当我在构建文件中测试某些目标的属性覆盖时,遇到了与您相同的错误。一旦我从路径中消除了空格,一切都正常了。 - Scott Lawrence
是的。我很想消除当前导致我头痛的“Program Files”中的空格,但这有点麻烦。这真让人沮丧 :( - Mahol25
我喜欢微软为我们建立的开发生态系统,但他们确实做了一些愚蠢的事情。比如在许多必要路径中加入空格,然后确保他们的工具不喜欢路径中有空格。另一个问题是,他们推广64位,64位,64位,但自己的工具在64位环境下却存在问题。没有什么比拿到一个新的2008 R2构建服务器,然后不得不编辑每个构建定义(在Team Build中)以使用x86兼容的MSBuild更令人沮丧的了。 - Alex

3
为什么您的msbuild标签为空?它应该类似于以下内容:
<msbuild>
  <executable>C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\MSBuild.exe</executable>
  <workingDirectory>C:\dev\ccnet</workingDirectory>
  <projectFile>CCNet.sln</projectFile>
  <buildArgs>/noconsolelogger /p:Configuration=Debug /v:diag</buildArgs>
  <targets>Build;Test</targets>
  <timeout>900</timeout>
  <logger>C:\Program Files\CruiseControl.NET\server\ThoughtWorks.CruiseControl.MsBuild.dll</logger>
</msbuild>

我为了问题的简单性而去除了它的标签 - 即使像你所示的那样我也得到了相同的错误信息。 - Jeff Stong

1

由于您似乎没有指定项目/解决方案文件,因此没有更多的细节可供提供,这会让MSBuild假定一个。如果您在该目录中有多个文件可用作MSBuild项目文件,则可能会导致问题。您是否有任何MSbuild .proj和.sln文件?或者两个解决方案文件?


<workingDirectory> 指定的目录中只有一个 .sln 文件。如果我打开 cmd 窗口并运行没有任何参数的 MSBuild,则可以构建而无错误。仅当我添加 cc.net 添加的所有额外参数时,它才会失败。 - Jeff Stong

1
我曾经遇到过类似的问题,像Alex所说,去掉空格确实解决了问题。但是,我也遇到了另外一种情况,无法去掉名称中的空格。在这种情况下,给名称加上引号解决了我的问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接