从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'))/>
只会导致语法错误“找到意外的令牌”。
任何想法,将不胜感激。
谢谢汉斯
我之前想过这个解决方案......
<FilesToCopy Include="@(FilesToRename->'%(Rename)')" />
<FilesToCopy Include="@Files" Exclude="@(Files->HasMetadata('Rename'))" />
很简单...