为什么MSBuild无法构建带有点号的项目名称?

25

至今为止的故事

我有一个不错的解决方案,其中包括一个桌面应用程序项目、几个库项目和一些开发工具项目(也是桌面应用程序)。目前,我的构建服务器将所有代码输出到一个OutputPath中。所以我们最终得到了:

drop-x.y.z\  
  Company.MainApplication.exe      <-- main application   
  Company.MainApplicationCore.dll  <-- libraries  
  Helper.exe                       <-- developer tools  
  Grapher.exe  
  Parser.exe  
  ...                              <-- the rest of the output

但是,我们正在成长,团队外的人想要获得我们的工具。因此,我希望组织输出。我决定我们想要的是每个可执行项目有一个不同的OutputPath

drop-x.y.z\
  Company.MainApplication\
    Company.MainApplication.exe      <-- main application 
    Company.MainApplicationCore.dll  <-- libraries
    ...                              <-- application specific output
  Helper\
    Helper.exe                       <-- developer tools
    ...                              <-- tool specific output
  Grapher\
    Grapher.exe
    ...
  Parser\
    Parser.exe
    ...

我做了什么

我找到了这个简单的命令。我喜欢它,因为它保留了所有解决方案工作目录的上下文,这让使用msbuild变得麻烦。

msbuild /target:<ProjectName>
例如,以我的解决方案根目录作为工作目录,我会调用:
PS> msbuild /target:Helper /property:OutputPath="$pwd\out\Helper"
我正在使用PowerShell测试这个命令,以便使$pwd解析为我的工作目录的完整路径或者在这种情况下是解决方案的根目录。我得到了所需的输出。
然而,当我运行这个命令时:
PS> msbuild /target:Company.MainApplication /property:OutputPath="$pwd\out\Company.MainApplication"

出现以下错误输出(没有更多信息,我使用了/verbosity:diagnostic运行)

项目中不存在目标“Company.MainApplication”。


我需要什么

该命令在任何名称中带有一个或多个点的项目上失败。我尝试了许多工作目录和属性组合。我尝试了几种转义属性值的方法。我还尝试从一个targets文件中的<Task>运行该命令。

我需要知道: A)如何修复此命令以使其正常工作
B)如何以最小的障碍获得相同的输出

3个回答

47

尝试在目标参数中使用下划线作为点的转义字符,例如:

msbuild /target:Company_MainApplication /property:OutputPath="$pwd\out\Company.MainApplication"

10
我非常感激这个“正确”的答案,但是为什么,为什么,为什么这就是答案! - Anthony Mastrean
3
好问题!我知道这个答案是因为在TeamCity中传递到MsBuild的所有系统属性都使用下划线代替点号。例如,在Ant中的{build.vcs.number.1}变为MsBuild中的$(build_vcs_number_1)。也许微软公司决定将点号作为预留字符,原因是项组引用的语法,如%myItem.filename%。 - Dan Nolan

4

-2

/targets:开关用于识别项目文件中要运行的<Target。您需要提供您的.csproj文件作为参数,该参数/xx选项标记为前缀。

您可能还想基于.sln文件进行工作。在这种情况下,仍然不要指定要在.sln中构建的项目。如果您最终采取这种方式,请自行查找正确的语法。


这个thread上的被接受的答案表明,我在使用/target:ProjectName开关时是正确的。 - Anthony Mastrean
请注意:以解决方案根目录作为工作目录时,此命令 msbuild /target:ProjectName 等同于 msbuild MySolution.sln /target:ProjectName - Anthony Mastrean
@AnthonyMastrean 非常感谢您的反馈,我接受 Dan Nolan 的答案是正确的。当时我从未听说过这种机制(我读了很多文章和 Hashimi 的书)- 如果有人能找到它的文档链接,我会非常感激。 - Ruben Bartelink

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