gpt4 book ai didi

msbuild - 调用可重用 msbuild 目标时将列表项传递给 Properties

转载 作者:行者123 更新时间:2023-12-02 04:29:05 24 4
gpt4 key购买 nike

我正尝试在 msbuild 中创建一个可重用的目标,遵循 How to invoke the same msbuild target twice? 中概述的基本模型

我一直在尝试传递一个我想解释为列表的属性。我还没有在网上找到处理这种情况的示例。据我了解,问题是 Properties 已经被视为列表项,因此它不喜欢也传入列表项。有没有办法让 msbuild 在此处正确打包和解包列表?

Msbuild 提示:

error MSB4012: The expression "FilesToZip=@(Scripts)" cannot be used in this context. Item lists cannot be concatenated with other strings where an item list is expected. Use a semicolon to separate multiple item lists.

这是一个调用者示例:

<Target Name="BuildMigrationZip">

<MSBuild Projects="BuildZip.msbuild"
Targets="BuildZip"
Properties="FilesToZip=@(Scripts);OutputZipFile=$(MigrationPackageFilePath);OutputFolder=$(MigrationPackagePath);Flatten=true"/>

<Message Text="Created database migration zip: $(MigrationPackageFilePath)" Importance="high"/>

</Target>

和基本目标:

<Target Name="BuildZip">

<MakeDir Directories="$(OutputFolder)"/>

<Zip Files="@(FilesToZip)"
ZipFileName="$(OutputZipFile)"
Flatten="$(Flatten)"
ParallelCompression="false" />

</Target>

我基本上正准备回去剪切和粘贴这些内容,尽管我想在这里打包一些 zip。

更新:同样的问题适用于在可重用目标上设置输入。到目前为止,我的问题解决了原始功能,但保持依赖项正常工作会很好。例如:

<Target Name="BuildZip"
Inputs="@(FilesToZip)"
Outputs="$(OutputZipFile)">

<MakeDir Directories="$(OutputFolder)"/>

<Zip Files="@(FilesToZip)"
ZipFileName="$(OutputZipFile)"
Flatten="$(Flatten)"
ParallelCompression="false" />

</Target>

最佳答案

它们的关键是将列表作为属性传递。因此,当您的 Scripts 列表定义为

<ItemGroup>
<Scripts Include="A"/>
<Scripts Include="B"/>
<Scripts Include="C"/>
</ItemGroup>

然后你首先将它转换成一个属性(这只是使分号分隔的项目,但 msbuild 知道如何通过 MSBuild 目标的 Properties 传递它)然后传递它到目标:

<Target Name="BuildMigrationZip">
<PropertyGroup>
<ScriptsProperty>@(Scripts)</ScriptsProperty>
</PropertyGroup>

<MSBuild Projects="$(MSBuildThisFile)" Targets="BuildZip"
Properties="FilesToZip=$(ScriptsProperty)" />
</Target>

(请注意,我在这里使用的是 $(MSBuildThisFile):您不一定需要为每个目标创建单独的构建文件,事实上,对于像您这样的小目标,它更方便放在同一个文件中)

然后在目标目标中再次将该属性转换为列表:

<Target Name="BuildZip">
<ItemGroup>
<FilesToZipList Include="$(FilesToZip)"/>
</ItemGroup>
<Message Text="BuildZip: @(FilesToZipList)" />
</Target>

输出:

BuildZip: A;B;C

更新

使用 Inputs 时,您不能传递 @(FilesToZip),因为它不会扩展为空,因为它不是列表:它是一个属性 - 恰好是一个数字分号分隔的字符串。因此,它可用于 Inputs,您只需将其扩展为属性即可,即 $(FilesToZip):

<Target Name="BuildZip"
Inputs="$(FilesToZip)"
Outputs="$(OutputZipFile)">
...
</Target>

第二次运行的输出:

BuildZip:
Skipping target "BuildZip" because all output files are up-to-date with respect to the input files.

关于msbuild - 调用可重用 msbuild 目标时将列表项传递给 Properties,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24587436/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com