msbuild其他项目并将输出复制到当前项目

时间:2014-08-16 21:59:07

标签: visual-studio-2010 visual-studio visual-studio-2012 msbuild

这是我的代码:

<ItemGroup>
    <ProjectsToBuild Include="$(ProjectDir)..\proj1.jsproj"/>
    <ProjectsToBuild Include="$(ProjectDir)..\proj2.jsproj"/>
    <!-- ... -->
  </ItemGroup>
  <PropertyGroup>
    <Config>Release</Config>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)' == 'Debug'">
    <Config>Debug</Config>
  </PropertyGroup>
    <Target Name="Build">
        <MSBuild Projects="@(ProjectsToBuild)" 
          ContinueOnError ="false"
          Properties="Configuration=@(Config)">
          <Output ItemName="OutputFiles" TaskParameter="TargetOutputs"/>
        </MSBuild>
        <!-- Need to copy single generated js file in each projects to current project (ie:mainProj\autogenerated folder) -->
    </Target>

因此,proj1.jsproj生成proj1.js单个文件,proj2.jsproj生成proj2.js单个文件,...

然后我需要将这些文件复制到:

$(ProjectDir)\ autogenerated \ proj1 \ proj1.js

$(ProjectDir)\ autogenerated \ proj2 \ proj2.js

...

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

这可以通过多种方式实现,这里使用元数据来声明目标目录,将构建和复制组合到一个目标中,并在调用该目标的ItemGroup上循环:

<ItemGroup>
  <ProjectsToBuild Include="$(ProjectDir)..\proj1.jsproj">
    <DestDir>proj1</DestDir>
  </ProjectsToBuild>
  <ProjectsToBuild Include="$(ProjectDir)..\proj2.jsproj">
    <DestDir>proj2</DestDir>
  </ProjectsToBuild>
</ItemGroup>

<Target Name="Build">
  <MSBuild Projects="$(MsBuildThisFile)" Targets="BuildAndCopy"
    Properties="ProjectToBuild=%(ProjectsToBuild.Identity);
                DestDir=$(ProjectDir)\autogenerated\%(ProjectsToBuild.DestDir)" />
</Target>

<Target Name="BuildAndCopy">
  <MSBuild Projects="$(ProjectToBuild)" Targets="Build" >
    <Output ItemName="OutputFiles" TaskParameter="TargetOutputs"/>
  </MSBuild>
  <Copy SourceFiles="@(OutputFiles)" DestinationFolder="$(DestDir)"/>
</Target>

现在,如果您的项目确实如此命名,并且您的目录结构就像可以简化:每个项目唯一不同的部分就是名称,所以您可以简单地使用

<ItemGroup>
  <ProjectsToBuild Include="proj1">
  <ProjectsToBuild Include="proj2">
</ItemGroup>

然后从中获取所有其他路径。

另一种方法是在每个项目中导入一个公共的MsBuild文件,并使公共文件声明一个postbuild事件,将$(OutputFile)复制到$(ProjectDir)\ autogenerated \ $(ProjectName)\ $(OutputFile)或类似的东西那;我不熟悉js项目,所以名字可能是错的,但你明白了。这样就不需要额外的MsBuild文件来构建项目了。