【问题标题】:msbuild other projects and copy output to current projectmsbuild 其他项目并将输出复制到当前项目
【发布时间】:2014-10-10 06:00:02
【问题描述】:

这是我的代码:

<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

...

提前感谢您的帮助。

【问题讨论】:

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


    【解决方案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 文件来构建项目。

    【讨论】:

      猜你喜欢
      • 2010-09-20
      • 2011-08-20
      • 1970-01-01
      • 2019-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-07
      • 1970-01-01
      相关资源
      最近更新 更多