visual-studio - MSBuild 解决方案命令行输出到单个文件夹

标签 visual-studio visual-studio-2012 deployment msbuild

目前,我有以下 MSBuild 命令:

msbuild 
    /t:Build 
    /p:Configuration=Release 
    /p:OutputPath=C:\MySolutionOutput\ 
    MySolution.sln

但是,它可以编译,我的解决方案中有多个项目。当我使用解决方案文件以这种方式进行构建时,它会将所有项目输出复制到同一目录,并且 Project2 的输出会覆盖 Project1 的输出(或它们内置的任何顺序)。

相反,我希望 MSBuild 将每个项目放入项目名称的子文件夹中。
msbuild 
    /t:Build 
    /p:Configuration=Release 
    /p:OutputPath=C:\MySolutionOutput\$(ProjectName)
    MySolution.sln

然而,$(ProjectName)语法不起作用,因为它实际上创建了一个名为 $(ProjectName) 的文件夹。

如何使 MSBuild 解决方案构建将每个项目输出到 OutputPath 的子目录,最好不要制作 MSBuild xml 文件,或单独构建每个项目?

为了进一步说明,我的项目如下。
+ Project 1
    + File1.txt
    + File2.txt
    + ReadMe.txt

+ Project 2
    + File3.txt
    + File4.txt
    + ReadMe.txt     

我的构建输出什么
C:\MySolutionOutput\File1.txt
C:\MySolutionOutput\File2.txt
C:\MySolutionOutput\File3.txt
C:\MySolutionOutput\File4.txt
C:\MySolutionOutput\ReadMe.txt 
^-- (this is the 2nd readme, project 1's readme gets overwritten)

我想要的是
C:\MySolutionOutput\Project 1\File1.txt
C:\MySolutionOutput\Project 1\File2.txt
C:\MySolutionOutput\Project 1\ReadMe.txt

C:\MySolutionOutput\Project 2\File3.txt
C:\MySolutionOutput\Project 2\File4.txt
C:\MySolutionOutput\Project 2\ReadMe.txt

最佳答案

使用 msbuild 构建解决方案时,它会在内部将解决方案转换为 msbuild xml 文件,该文件构建所有项目并将 OutputPath 之类的属性传递给它,并且 afaik 没有办法干扰它的行为方式。一种可能的解决方案确实需要您自己编写 msbuild 文件,但修改确实很小。您没有提及您使用的是哪种项目类型,但任何类型的原理都是相同的,以下是 C# 项目的示例:

  • 创建一个通用文件,允许以您想要的方式覆盖 OutputPath,但除非特别告知以在需要时保持现有行为,否则不执行任何操作
  • 在每个项目中导入该文件
  • 在命令行中指定自定义输出目录

  • msbuild 文件,比如 outputpath.props :
    <?xml version="1.0" encoding="utf-8"?>
    <Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <PropertyGroup>
        <OutputPath Condition="'$(OutputPathBaseDir)' != ''">$(OutputPathBaseDir)\$(MSBuildProjectName)\</OutputPath>
      </PropertyGroup>
    </Project>
    

    在每个项目中导入;这里我使用的是相对路径,但您可以引用例如 $(SolutionDir) 等;对于 c# 项目,在显示的那一行之前插入这一行
    <Import Project="..\outputpath.props" />
    <!--the below is an existing line in every c# project-->
    <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
    

    现在构建:
    msbuild mysolution.sln /p:OutputPathBaseDir=C:\MySolutionOutput
    

    关于visual-studio - MSBuild 解决方案命令行输出到单个文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25191467/

    相关文章:

    visual-studio-2012 - 使用 IP 地址而不是 localhost 浏览网站

    xml - 由于自动加载重复的 xsd 文件,Visual Studio 2012 XML 智能感知被破坏

    java - Tomcat 的 Python 等价物是什么?

    javascript - nestjs 应用程序的生产部署的正确方法是什么

    deployment - 将PIA部署到Office的混合版本

    java - Xamarin Android 在 Visual Studio 中绑定(bind)并使用 Java 库

    c++ - 使用 std::wofstream 写入文件。该文件仍然是空的

    c# - 如何添加对 WinForm 项目的引用?

    visual-studio - 为整个团队设置 Visual Studio 格式选项

    visual-studio-2012 - 如何将现有 SQL Server 数据库添加到 TFS 源代码管理?