0

我想执行一个 msbuild 项目,它使用批处理来确定一个或多个csproj项目是新构建的,因此需要新的 nuget 打包。到目前为止,我制作的脚本似乎是一个合理的开始,但增量构建机制不起作用。MainBuild无论如何,目标每次都会执行。

这是我所拥有的:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="MainBuild" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)'=='' ">Debug</Configuration>
    <Content>content\plugins\</Content>
  </PropertyGroup>
  <ItemGroup>
    <Nuspec Include="$(MSBuildProjectDirectory)\plugins\*\*.nuspec" />
  </ItemGroup>

<Target Name="MainBuild"
        Inputs="%(Nuspec.RootDir)%(Nuspec.Directory)bin\$(Configuration)\*.dll"
        Outputs="%(Nuspec.RootDir)%(Nuspec.Directory)%(FileName).pkg" >
  <ItemGroup>
    <Inputs Include="%(Nuspec.RootDir)%(Nuspec.Directory)bin\$(Configuration)\*.dll" />
    <Outputs Include="%(Nuspec.RootDir)%(Nuspec.Directory)%(FileName).pkg" />
  </ItemGroup>
  <Message Text="INPUTS: %(Inputs.FullPath)" />
  <Message Text="OUTPUTS: @(Outputs->'%(FullPath)')" />

  <Copy SourceFiles="@(Inputs)" DestinationFiles="@(Outputs->'%(FullPath)')" />

</Target>
</Project>

Copy任务只是一个调试占位符,用于调用 nuget 并创建一个新包。

这个想法是,如果bin\Debug目录中的任何文件比相应的 .nuspec 文件(在上面找到两个文件夹bin\Debug)新,那么MainBuild目标应该执行。

有任何想法吗?

ps 的InputsOutputs属性Target大概每个都创建一个项目。我认为创建的项目无法在目标内部引用,这很奇怪。在上面的示例中,我必须创建一个 target-interna 动态 ItemGroup 来重新创建项目,以便我可以访问它们。有办法解决吗?

4

1 回答 1

0

我在MSBuild Batching 文档中读到了这个

如果目标内的任务使用批处理,则 MSBuild 需要确定每批项目的输入和输出是否是最新的。否则,每次命中目标时都会执行该目标。

这可能是杯子。尝试更改您的复制目标以使用批处理而不是 ite 转换(我认为在项目组中使用项目元数据不能满足上述要求)。

<Target Name="MainBuild"
        Inputs="%(Nuspec.RootDir)%(Nuspec.Directory)bin\$(Configuration)\*.dll"
        Outputs="%(Nuspec.RootDir)%(Nuspec.Directory)%(FileName).pkg" >
    <ItemGroup>
        <Inputs Include="%(Nuspec.RootDir)%(Nuspec.Directory)bin\$(Configuration)\*.dll" />
        <Outputs Include="%(Nuspec.RootDir)%(Nuspec.Directory)%(FileName).pkg" />
    </ItemGroup>
    <Message Text="INPUTS: %(Inputs.FullPath)" />
    <Message Text="OUTPUTS: @(Outputs->'%(FullPath)')" />

    <Copy SourceFiles="@(Inputs)" DestinationFiles="%(Outputs.FullPath)" />

</Target>

看起来输入的数量可能与输出的数量不同(我怀疑每个项目的输出目录中有多个 .dll 文件),这也会导致目标执行。

于 2013-01-04T14:33:12.150 回答