代码之家  ›  专栏  ›  技术社区  ›  GuyBehindtheGuy

从3.5构建msbuild 2.0项目

  •  4
  • GuyBehindtheGuy  · 技术社区  · 17 年前

    我有一个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,而不是它的解决方案文件。

    4 回复  |  直到 17 年前
        1
  •  2
  •   David McEwing    17 年前
    1. 确保项目C是项目B的依赖项。(在这种情况下,没有项目B,但如果有,那么确保。)
    2. 在文本编辑器中编辑项目C的项目文件。在文件的底部,但在关闭项目标记之前添加以下内容,其中a.sln是项目A的解决方案。

      <项目组& GT;
      <projectstobuild include=“a.sln”/>
      </itemgroup>
      <target name=“beforebuild”>
      MSBug
      projects=“@(projectstobuild)”
      targets=“build”toolsversion=“2.0”>
      产出
      taskParameter=“目标输出”
      itemname=“assembliesbuiltbychildprojects”/>
      </msbuild>
      <copy sourcefiles=“@(目标输出)”
      destinationfolder=“@(solutiondir)\references”
      /gt;
      & /目标& GT;

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

    4. 构建项目B。

    我没有测试过,但是这个概念应该有效。

        2
  •  1
  •   tabdamage    17 年前

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

    我曾经成功地将VS2008中的二进制、包含和库路径设置为使用编译器和VS2005(它是Win32 C++项目)。

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

    豪托:

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

    • 在2008版本的项目中添加属性页thingy(不知道它的英文名称,它是.vsprops文件)。 使用二进制文件,将assembly和include目录设置为2005安装的目录 从而迫使VS2008为该项目使用2005工具集。 您可能需要VS2008的专业版本来创建这样的文件,但所有版本都应该能够读取它)

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

    也许有更好的解决办法,但由于你至今没有答案,我建议你采取这种变通办法。

        3
  •  1
  •   Mehmet Aras    17 年前

    这个怎么样? 编辑Project C的proj文件以包含exec msbuild任务,该任务使用/build开关调用vs2005 devenv以生成项目A,然后将输出文件从项目A生成复制到项目C可以找到的位置。在编译项目C之前,您需要在项目C的proj文件中的一个构建步骤中进行操作,以便在构建之前,项目C可以找到项目A的输出。

        4
  •  1
  •   gts    17 年前

    只是SLN格式不同,在VS2008中,csproj/vbproj文件“可以”保持不变… 所以基本上,您需要两个SLN文件,在两个SLN中添加您的csprojs/vbprojs。

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