从3.5构建MSBuild 2.0项目

时间:2009-04-23 17:16:55

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

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

  1. 通过命令行或Visual C#2008 Express在Solution B上开始构建。通过两者
  2. 开展工作至关重要
  3. 让Project C触发项目A的构建。
  4. 将项目A(类库)的输出复制到项目C。
  5. 在解决方案B中构建项目C和其余项目。
  6. 这是一个图表:
        MSBuild 3.5或VS2008->
        [解决方案B(3.5)] - >
        [项目C(3.5)] - >
        [项目A(2.0)] - >
        将A的输出复制到C->     继续构建解决方案B

    关于如何设置它的任何想法?工作项目文件中的剪辑将非常感谢!提前谢谢!


    以下是需要添加到Project 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而不是其解决方案文件的原因。

4 个答案:

答案 0 :(得分:2)

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

    &LT;&的ItemGroup GT;
    &lt; ProjectsToBuild Include =“a.sln”/&gt;
    &LT; /&的ItemGroup GT;
    &lt; Target Name =“BeforeBuild”&gt;
    &LT;的MSBuild
    项目= “@(ProjectsToBuild)”
    Targets =“Build”ToolsVersion =“2.0”&gt;
    &LT;输出
                    TaskParameter = “TargetOutputs”
                    ItemName =“AssembliesBuiltByChildProjects”/&gt;
    &LT; / MSBuild的&GT;
         &lt; Copy SourceFiles =“@(TargetOutputs)”
               DestinationFolder = “@(SolutionDir)\参考”
    /&GT;
    &LT; /目标&GT;

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

  4. 构建项目B。

  5. 我没有测试过,但这个概念应该有用。

答案 1 :(得分:1)

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

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

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

HOWTO:

  • 复制并重命名2005项目,然后再将其转换为2008年。(要有一个干净的2005版本可用)
  • 将新转换的项目添加到2008解决方案,设置依赖项。

  • 添加一个属性页面内容(不知道它是用英语调用的,它是一个.vsprops文件)到项目的<2008>版本,其中包含二进制,汇编和包含目录到2005年的安装,从而迫使vs2008为该项目使用2005工具集。 您可能需要专业版的vs2008来创建这样的文件,但所有版本都应该能够读取它。)

基本上,您将仅使用2008年的编辑器组件和2005年的编译器。

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

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