为什么MSBuild不会在名称中使用点构建项目?

Ant*_*ean 20 msbuild

迄今为止的故事

我有一个很好的解决方案,包括桌面应用程序项目,一些库项目和一些开发工具项目(也是桌面应用程序).目前,我的构建服务器将所有代码输出到一个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
Run Code Online (Sandbox Code Playgroud)

但是,我们正在成长,我们团队以外的人希望访问我们的工具.所以我想组织输出.我决定我们想要的是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
    ...
Run Code Online (Sandbox Code Playgroud)

我做了什么

我找到了这个简单的命令.我喜欢它,因为它保留了所有解决方案work-dir上下文,这使得msbuild很痛苦.

msbuild /target:<ProjectName>
Run Code Online (Sandbox Code Playgroud)

例如,从我的解决方案root作为工作目录,我会打电话

PS> msbuild /target:Helper /property:OutputPath="$pwd\out\Helper"
Run Code Online (Sandbox Code Playgroud)

我正在从PowerShell中测试它,因此$pwd解析为我的工作目录的完整路径,或者在这种情况下解析为根目录.我得到了我想要的输出.

但是,当我运行此命令时

PS> msbuild /target:Company.MainApplication /property:OutputPath="$pwd\out\Company.MainApplication"
Run Code Online (Sandbox Code Playgroud)

我得到以下错误输出(没有更多的信息,我跑了/verbosity:diagnostic)

项目中不存在目标"Company.MainApplication".


我需要的

命令在名称中带有点或点的任何项目上都会失败.我尝试了许多工作目录和属性的组合.我尝试了几种逃避属性值的方法.我也尝试从<Task>目标文件中运行命令.

我需要知道
A)如何将此命令修复为工作属性
B)如何以最小的摩擦力实现相同的输出

Dan*_*lan 34

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

msbuild /target:Company_MainApplication /property:OutputPath="$pwd\out\Company.MainApplication"
Run Code Online (Sandbox Code Playgroud)

  • 我非常感谢这个_correct_答案,但为什么,为什么,为什么这就是答案! (6认同)
  • 好问题!我之所以知道这一点,是因为TeamCity中传递给MsBuild的所有系统属性都使用下划线代替点.例如,Ant中的{build.vcs.number.1}在MsBuild中变为$(build_vcs_number_1).由于项目组引用的语法,例如%myItem.filename%,MSFT可能只是决定点应该成为保留字符 (3认同)

小智 5

在 -target: 开关后指定目标,格式为 :。如果项目名称包含任何字符 %、$、@、;、.、(、) 或 ',请将它们替换为指定目标名称中的 _。

https://learn.microsoft.com/en-us/visualstudio/msbuild/how-to-build-specific-targets-in-solutions-by-using-msbuild-exe?view=vs-2019

丹·诺兰的回答和评论是正确的。只是想补充一下微软的文档。