msbuild:如何提取没有元数据的项目?

问题描述 投票:0回答:1

从msbuild“Item”,我想提取所有没有元数据的成员(如果我使用错误的术语,请原谅我)。

这是我的背景:我正在准备用于创建安装包的文件。应该进入包的文件在“Item”中定义,如下所示:

<ItemGroup>
  <Files Include="readme.txt" />
  <Files Include="myfile.txt">
    <Rename>help.txt</Rename>
  </Files>
  <Files Include="changes.log" />
  <!-- more files -->
</ItemGroup>

虽然readme.txt应该按原样包含,但myfile.txt应该重命名为help.txt,因为有人认为myfile.txt是一个糟糕的名字。我创建了一个序列(在目标内),重命名具有“重命名”元数据的文件。

<ItemGroup>
  <FilesToRename Include="@(ChangeLogs->HasMetadata('Rename'))"/>
</ItemGroup>
<Move SourceFiles="@(FilesToRename->'$(WorkDir)\source\%(Identity)')" DestinationFiles="@(FilesToRename->'$(WorkDir)\source\%(Rename)')" />

为了将这些文件复制到安装包中,我需要一个项目,其中包含重命名文件的“重命名”名称和其他文件的原始名称;在这个例子中,“readme.txt; help.txt; changes.log”(以任何顺序)。我的第一次尝试是使用上面的“FilesToRename”,并添加如下所示的“倒置”表达式:

<FilesToCopy Include="@(FilesToRename->'%(Rename)')" />
<FilesToCopy Include="@(Files->Not HasMetadata('Rename'))" />

但这并没有扩大。我也不能做出“条件”工作,比如

<FilesToCopy Include="@(Files)" Condition="Not @(Files->HasMetadata('Rename'))/>

只会导致语法错误“找到意外的令牌”。

任何想法,将不胜感激。

谢谢汉斯

msbuild metadata items
1个回答
0
投票

我之前想过这个解决方案......

<FilesToCopy Include="@(FilesToRename->'%(Rename)')" />
<FilesToCopy Include="@Files" Exclude="@(Files->HasMetadata('Rename'))" />

很简单...

© www.soinside.com 2019 - 2024. All rights reserved.