【问题标题】:Building an MSBuild 2.0 project from 3.5从 3.5 构建 MSBuild 2.0 项目
【发布时间】:2009-04-23 17:16:55
【问题描述】:

我有一个 VS 2005/MSBuild 2.0 项目(我们称之为“项目 A”),我必须保留在 VS 2005 中(它使用第三方 VS 2005 设计器。)项目 A 是由我的新 VS 2008 解决方案中的一个项目引用(我们将分别称它们为“项目 C”和“解决方案 B”。)理想情况下,我想将项目 A 的构建链接到解决方案 B 的构建中,我相信“ToolsVersion”属性是关键。所以,回顾一下,这就是我需要做的:

  1. 通过命令行或 Visual C# 2008 Express 在解决方案 B 上开始构建。它通过两者工作是至关重要的!
  2. 让项目 C 触发项目 A 的构建。
  3. 将项目 A(类库)的输出复制到项目 C。
  4. 构建项目 C 和解决方案 B 中的其余项目。

这是一个图表:
MSBuild 3.5 或 VS2008->
[解决方案 B (3.5)]->
[项目 C (3.5)]->
[项目 A (2.0)]->
将 A 的输出复制到 C->
继续构建解决方案 B

关于我应该如何设置的任何想法?来自工作项目文件的剪辑将不胜感激!提前致谢!

解决方案
以下是项目 C 中需要添加的内容,以使其工作:

<ItemGroup>
   <ProjectToBuild Include="..\ProjectA\ProjectA.csproj" />
</ItemGroup>
<Target Name="BeforeBuild">
   <MSBuild
     Projects="@(ProjectToBuild)"
     Targets="Rebuild" ToolsVersion="2.0">
              <Output
              TaskParameter="TargetOutputs"
              ItemName="AssembliesBuiltByChildProjects" />
   </MSBuild>
   <Copy SourceFiles="@(AssembliesBuiltByChildProjects)"
            DestinationFolder="$(MSBuildProjectDirectory)"
    />
</Target>

请注意,有一个known issue 用于通过 MSBuild 任务获取解决方案的 TargetOutputs。这应该在 MSBuild 3.5 中得到修复,但我猜是 ToolsVersion 属性导致它重新出现。这就是我直接引用 ProjectA.csproj 而不是它的解决方案文件的原因。

【问题讨论】:

  • 为什么项目 A 必须使用解决方案 B 构建?您不能只引用项目 A 程序集以及解决方案 B 中的其他依赖项吗?
  • 当然。但是,如果我可以进行此设置(并且我很确定这是可能的),我可以让我的构建服务器和我的开发人员立即知道项目 A 中的更改是否破坏了项目 C。

标签: visual-studio-2008 visual-studio-2005 msbuild


【解决方案1】:
  1. 确保项目 C 是项目 B 的依赖项。(在这种情况下,没有项目 B,但如果有,请确保。)
  2. 在文本编辑器中编辑项目 C 的 proj 文件。在文件底部但在结束项目标记之前添加以下内容,其中 a.sln 是项目 A 的解决方案。





    Projects="@(ProjectsToBuild)"
    Targets="Build" ToolsVersion="2.0">
    TaskParameter="目标输出"
    ItemName="AssembliesBuiltByChildProjects" />

    DestinationFolder="@(SolutionDir)\References"
    />
    目标>

  3. 在您的解决方案下创建一个引用文件夹,并确保将其标记为项目 C 的引用文件夹。

  4. 构建项目 B.

我还没有测试过,但这个概念应该可行。

【讨论】:

  • 你能解释一下第 1 步吗?没有项目 B。有一个解决方案 B,还有一个项目 A 和 C。对不起那些愚蠢的字母。
  • 忽略第一步,我错过了阅读图表。项目 C 在解决方案 B 中。项目 A 不需要在 VS2008 解决方案中,但需要在它自己的 VS2005 解决方案中。如果您需要 Get recursive 上的 Source 集成,那么您可以在解决方案 C 中包含项目 A,但将其排除在配置管理器中的构建之外。由于在步骤 2 中添加了构建任务,它仍将被构建。
  • 不应该@(ProjectReferences) 是@(ProjectToBuild) 吗?
  • 好吧,大卫,你的回答有点草率,但它让我走上了正轨,所以我会奖励你。
【解决方案2】:

您没有说明需要在该项目上使用 Visual Studio 2005 的具体原因。 (我知道这样做是有正当理由的,但它们可能意味着不同的解决方案。)

我曾经成功做的是在 VS2008 中设置二进制、包含和库路径以使用 vs2005 的编译器和包含(这是一个 win32 c++ 项目)。

您可以从编译器选项中删除 /nologo 以实际查看使用的编译器版本。

如何:

  • 复制并重命名 2005 项目,然后再将其转换为 2008。(以提供干净的 2005 版本)
  • 将新转换的项目添加到2008解决方案中,设置依赖关系。

  • 在项目的2008版本中添加一个properties-page-thingy(不知道英文叫什么,是个.vsprops文件)设置了binary、assembly和include目录到您的 2005 安装,从而强制 vs2008 为该项目使用 2005 工具集。 你可能需要专业版的vs2008来创建这样的文件,但是所有版本都应该可以读取)

基本上,您将只为该项目使用 2008 的编辑器组件和 2005 的编译器。

对此可能有更好的解决方案,但由于到目前为止您还没有答案,我提出了这个解决方法。

【讨论】:

  • 我确实做到了,但我删除了它以试图简化问题。 VS2005项目使用的第三方设计器只能在2005年使用。:-{
【解决方案3】:

这个怎么样: 编辑项目 C 的 proj 文件以包含一个 Exec MSbuild 任务,该任务使用 /build 开关调用 VS2005 devenv 以构建项目 A,然后将输出文件从项目 A 构建复制到项目 C 可以找到的位置。在项目C编译之前,你需要在项目C的proj文件中做一个构建步骤,可能是BeforeBuild,这样项目C才能找到项目A的输出。

【讨论】:

  • 很高兴知道降级的原因。
【解决方案4】:

VS2008 中只是 SLN 格式不同,CSPROJ/VBPROJ 文件“可以”保持不变... 所以基本上你需要两个 SLN 文件在两个 SLN 中添加你的 CSPROJs/VBPROJs。

阅读http://weblogs.asp.net/palermo4/archive/2007/07/30/managing-projects-in-visual-studio-2005-amp-2008.aspx了解更多信息。

【讨论】:

    猜你喜欢
    • 2010-10-15
    • 2014-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多