【发布时间】: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'))/>
这只会导致语法错误“发现意外的令牌”。
任何想法都将不胜感激。
谢谢 汉斯
【问题讨论】: