【问题标题】:structure solution outputpath by project按项目构建解决方案输出路径
【发布时间】:2012-02-10 17:11:57
【问题描述】:

我正在使用 msbuild 构建一个 Visual Studio 解决方案

msbuild.exe my.sln

这样,它将所有内容输出到每个项目中指定的输出路径(默认为 bin\),但在这种情况下,我需要将所有输出工件放在不同的文件夹中,用于打包。如果我运行

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

然后所有的工件都将在指定的文件夹中结束,但结构将是扁平的。我想要的是:

\package
    \project1
    \project2
    ...

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

【问题讨论】:

  • 感谢投反对票,无论是谁。解决方案可能是运行一个 powershell 脚本来修改项目文件,然后构建它们,然后撤消修改 - 似乎只有 MSBuild 无法做到这一点
  • 有些人很奇怪,不是吗。我认为这是一个很好的问题。

标签: msbuild projects-and-solutions


【解决方案1】:

可能有更好的方法,但您可以做的一件事是使用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>

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

【讨论】:

  • 一个好主意,但是 %(RecursiveDir) 会给我完整的路径,而不仅仅是项目名称 - 就我而言,这可能是一条很长的路径。
  • %(RecursiveDir) 应该只给出匹配通配符(**)的部分,所以如果你的项目都直接在 src\ 文件夹下,你只会得到项目名称。如果您有不同的文件夹结构,也许您可​​以使用字符串函数来修改元属性。请参阅此处了解更多信息:msdn.microsoft.com/en-us/library/ms164313.aspx
  • 遗憾的是,项目不在 src 文件夹下
  • 对,这只是一个示例,您需要对其进行更改以适应您自己的代码结构。祝你好运。
  • 问题是,遗憾的是,没有办法将您的示例应用于项目结构,所有项目都不直接位于 src 文件夹下。
猜你喜欢
  • 2011-06-07
  • 2020-06-01
  • 2013-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-25
相关资源
最近更新 更多