Msbuild 按项目构建解决方案输出路径

Msbuild 按项目构建解决方案输出路径,msbuild,projects-and-solutions,Msbuild,Projects And Solutions,我正在使用msbuild构建visual studio解决方案 msbuild.exe my.sln 通过这种方式,它将所有内容输出到每个项目中指定的输出路径(默认情况下为bin\),但在这种情况下,我需要所有输出工件位于不同的文件夹中,用于打包。如果我跑 msbuild.exe my.sln /p:OutputhPath=<someFolder> 但是如果不修改单个项目文件(这几乎是不可能的),我想不出一个好方法来做到这一点。有什么想法吗?(msbuild 4.0,VS2010

我正在使用msbuild构建visual studio解决方案

msbuild.exe my.sln
通过这种方式,它将所有内容输出到每个项目中指定的输出路径(默认情况下为bin\),但在这种情况下,我需要所有输出工件位于不同的文件夹中,用于打包。如果我跑

msbuild.exe my.sln /p:OutputhPath=<someFolder>

但是如果不修改单个项目文件(这几乎是不可能的),我想不出一个好方法来做到这一点。有什么想法吗?(msbuild 4.0,VS2010-如果这有什么改变的话)

可能有更好的方法,但是可以做的一件事是使用
msbuild.exe my.sln
就地构建,然后将输出复制到
\package
目录,这样就可以保留层次结构。这应该很简单。您可以将此作为起点:

<Target Name="Package">
    <PropertyGroup>
      <SourceFolder>$(MSBuildProjectDirectory)\src</SourceFolder>
      <TargetFolder>$(MSBuildProjectDirectory)\package</TargetFolder>
    </PropertyGroup>

    <ItemGroup>
      <FilesToCopy Include="$(SourceFolder)\**\bin\Debug\**\*.*" />
    </ItemGroup>

    <!-- Recursive copy w/o flattening folder structure: -->
    <Copy 
        SourceFiles="@(FilesToCopy)" 
        DestinationFiles="@(FilesToCopy->'$(TargetFolder)\%(RecursiveDir)%(Filename)%(Extension)')"
      />
  </Target>

$(MSBuildProjectDirectory)\src
$(MSBuildProjectDirectory)\package

您还可以定义一个属性来跟踪生成配置,并将硬编码的
bin\Debug
替换为
bin\$(BuildConfig)

这是一个好主意,但是%(RecursiveDir)将为我提供完整的路径,而不仅仅是项目名称-在我的情况下,这可能是一个相当长的路径。%(RecursiveDir)应该只提供与通配符(**)匹配的部分,因此,如果您的项目都直接位于src\文件夹下,您将只获得项目名称。如果您有不同的文件夹结构,也许可以使用字符串函数修改元属性。请参见此处了解更多信息:遗憾的是,这些项目并不直接位于src folderRight之下,这只是一个示例,您需要对其进行更改以适应您自己的代码结构。祝你好运。问题是,不幸的是,没有办法将你的例子应用到一个项目结构中,在这个结构中,所有的项目都不直接在src文件夹下。谢谢你的否决票,不管是谁。解决方案可能是运行一个powershell脚本来修改项目文件,然后构建它们,然后撤消修改-似乎只有MSBuild无法做到这一点有些人很奇怪,不是吗。我认为这是一个好问题。
<Target Name="Package">
    <PropertyGroup>
      <SourceFolder>$(MSBuildProjectDirectory)\src</SourceFolder>
      <TargetFolder>$(MSBuildProjectDirectory)\package</TargetFolder>
    </PropertyGroup>

    <ItemGroup>
      <FilesToCopy Include="$(SourceFolder)\**\bin\Debug\**\*.*" />
    </ItemGroup>

    <!-- Recursive copy w/o flattening folder structure: -->
    <Copy 
        SourceFiles="@(FilesToCopy)" 
        DestinationFiles="@(FilesToCopy->'$(TargetFolder)\%(RecursiveDir)%(Filename)%(Extension)')"
      />
  </Target>