从3.5版本构建一个MSBuild 2.0项目

4
我有一个VS 2005/MSBuild 2.0项目 (我们称之为 "Project A"),我必须保留在VS 2005中 (它使用了第三方的VS 2005设计工具)。 我新建了一个VS 2008解决方案 (我们分别称之为 "Project C" 和 "Solution B"),其中一个项目引用了Project A。理想情况下,我希望将Project A的构建链接到Solution B的构建中,而我相信 "ToolsVersion" 属性是关键。 因此,总结一下,这是我需要做的事情:
  1. 通过命令行或Visual C# 2008 Express启动Solution B的构建。这对于两者都非常重要!
  2. 让Project C触发Project A的构建。
  3. 将Project A的输出 (一个类库) 复制到Project C。
  4. 构建Project C和Solution B中的其他项目。
这里有一个图示:
MSBuild 3.5 或 VS2008->
[Solution B (3.5)]->
[Project C (3.5)]->
[Project 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>

注意,使用MSBuild任务获取解决方案的TargetOutputs存在已知问题。虽然这个问题应该在MSBuild 3.5中得到修复,但我猜测ToolsVersion属性导致它重新出现。这就是为什么我直接引用ProjectA.csproj而不是它的解决方案文件的原因。

为什么项目A一定要在解决方案B中构建?难道你不能只从解决方案B中引用项目A的程序集以及其他依赖项吗? - kay.herzam
当然可以。但如果我能够设置好这个(我相信这是可能的),我就可以让我的构建服务器和开发人员立即知道A项目的更改是否破坏了C项目。 - GuyBehindtheGuy
4个回答

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

    <ItemGroup>
       <ProjectsToBuild Include="a.sln"/>
    </ItemGroup>
    <Target Name="BeforeBuild">
       <MSBuild
             Projects="@(ProjectsToBuild)"
             Targets="Build" ToolsVersion="2.0">
                      <Output
                      TaskParameter="TargetOutputs"
                      ItemName="AssembliesBuiltByChildProjects" />
        </MSBuild>
        <Copy SourceFiles="@(TargetOutputs)"
                    DestinationFolder="@(SolutionDir)\References"
          />
      </Target>

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

  4. 构建项目 B。

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


你能澄清第一步吗?没有B项目。有一个B解决方案和A&C项目。对于这些愚蠢的字母,我很抱歉。 - GuyBehindtheGuy
忽略步骤一,我误读了图表。项目C在解决方案B中。项目A将不需要在VS2008解决方案中,但需要在自己的VS2005解决方案中。如果您需要在Get递归上进行源集成,则可以在解决方案C中包含项目A,但在配置管理器中排除它的构建。由于步骤2中添加的构建任务,它仍将被构建。 - David McEwing
@(ProjectReferences) 不应该是 @(ProjectToBuild) 吗? - GuyBehindtheGuy
好的,David,你的回答有点粗糙,但是它让我找到了正确的方向,所以我会授予你奖金。 - GuyBehindtheGuy

1

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

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

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

操作步骤:

  • 在将其转换为2008之前,复制并重命名2005项目。(以便有一个干净的2005版本可用)
  • 将新转换的项目添加到2008解决方案中,并设置依赖关系。

  • 向项目的2008版本添加属性页(不知道英文叫什么,它是一个.vsprops文件),将二进制、程序集和包含目录设置为您的2005安装目录,从而强制vs2008使用2005工具集进行该项目的开发。 您可能需要专业版的vs2008才能创建这样的文件,但所有版本都应该能够读取它)

基本上,您将仅使用2008的编辑器组件和2005的编译器来完成该项目。

可能有更好的解决方案,但由于您目前没有答案,我建议使用此解决方法。


我其实已经做过了,但是我把它删除了,试图简化问题。这个VS2005项目使用了一个只能在2005年版本中运行的第三方设计工具。:-{ - GuyBehindtheGuy

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

知道降级的原因会很好。 - Mehmet Aras

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接