【问题标题】:msbuild: How to extract items without metadata?msbuild:如何在没有元数据的情况下提取项目?
【发布时间】:2019-02-14 14:41:48
【问题描述】:

我想从 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 是一个糟糕的名称。 我创建了一个序列(在目标内),它重命名具有“重命名”元数据的文件。

<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】:

    我之前可以想到这个解决方案...

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

    这么简单……

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-05
      • 2014-06-21
      • 1970-01-01
      • 2015-10-26
      • 2021-08-15
      • 2012-08-20
      • 2012-12-10
      • 2015-01-01
      相关资源
      最近更新 更多