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

时间:2019-02-14 14:41:49

标签: msbuild metadata items

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

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

<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是一个不好的名字。 我创建了一个序列(在Target内),用于重命名具有“重命名”元数据的文件。

<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”,并添加“ inverted”表达式,如下所示:

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

,但不会扩展。我也无法像“ pd”那样制作“条件”作品

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

这只会导致语法错误“发现了意外令牌”。

任何想法都会受到赞赏。

谢谢 汉斯

1 个答案:

答案 0 :(得分:0)

我本来可以想到这个解决方案的...

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

那么简单...