在自定义构建工具 VS2012 MSBuild 中使用过滤器元数据
Use filter metadata in custom build tool VS2012 MSBuild
我有一个问题想优雅地解决,但现在不知道该怎么做。
在我的 C++ 解决方案 (VS2012) 中,我有一个包含所有 .dll 文件的项目,这些文件必须复制到输出目录才能完成部署。我还写了一个小的自定义工具来进行复制。
实际问题是我们必须为不同的配置部署不同的 .dll (Win32/x64/Debug/Release) 并且我们必须手动为每个文件和每个配置设置 ExcludedFromBuild
属性 .我想根据文件所在的过滤器自动设置此 属性。为了更好地查看为哪个配置复制了哪个 .dll,我将它们组织在具有以下结构的过滤器中。
- Win32
- 调试
- 发布
- x64
- 调试
- 发布
当我查看 vcxproj.filters
文件时,条目如下所示。
<CopyFiles Include="..\bin.x64\icudt54d.dll">
<Filter>x64\Debug</Filter>
</CopyFiles>
所以我想,我应该能够使用 %(CopyFiles.Filter)
访问复制目标中的过滤器
<Target Name="AddInputsAccordingToFilter">
<ItemGroup>
<CopyFiles Include="@(CopyFiles)" Condition="%(CopyFiles.Filter.StartsWith('$(Platform)') And %(CopyFiles.Filter.EndsWith('$(Configuration)')"/>
</ItemGroup>
</Target>
但这从来没有奏效,当我试图找出问题所在时,我发现 %(CopyFiles.Filter)
总是空的,因为 .vcxproj.filters
没有导入到 .vcxproj
文件中。我尝试手动将导入添加到 .vcxproj.filters
文件,但是 Visual Studio 中的过滤器完全搞砸了。
有谁知道在不搞乱 Visual Studio 项目的情况下自动执行此过程的方法吗?
.filters 文件不参与构建过程,但它可以像任何 xml 文件一样被 XmlPeek 任务查询。尝试以下操作:
<Target Name="AddInputsAccordingToFilter">
<XmlPeek Namespaces="<Namespace Prefix='n' Uri='http://schemas.microsoft.com/developer/msbuild/2003'/>"
XmlInputPath="$(MSBuildProjectFile).filters"
Query="/n:Project/n:ItemGroup/n:CopyFiles[starts-with(n:Filter, '$(Platform)')]/@Include">
<Output TaskParameter="Result" ItemName="FilesToCopy" />
</XmlPeek>
<ItemGroup>
<CopyFiles Include="@(FilesToCopy)"/>
</ItemGroup>
</Target>
考虑到此解决方案依赖于未记录的 .filter 文件格式。
我有一个问题想优雅地解决,但现在不知道该怎么做。
在我的 C++ 解决方案 (VS2012) 中,我有一个包含所有 .dll 文件的项目,这些文件必须复制到输出目录才能完成部署。我还写了一个小的自定义工具来进行复制。
实际问题是我们必须为不同的配置部署不同的 .dll (Win32/x64/Debug/Release) 并且我们必须手动为每个文件和每个配置设置 ExcludedFromBuild
属性 .我想根据文件所在的过滤器自动设置此 属性。为了更好地查看为哪个配置复制了哪个 .dll,我将它们组织在具有以下结构的过滤器中。
- Win32
- 调试
- 发布
- x64
- 调试
- 发布
当我查看 vcxproj.filters
文件时,条目如下所示。
<CopyFiles Include="..\bin.x64\icudt54d.dll">
<Filter>x64\Debug</Filter>
</CopyFiles>
所以我想,我应该能够使用 %(CopyFiles.Filter)
<Target Name="AddInputsAccordingToFilter">
<ItemGroup>
<CopyFiles Include="@(CopyFiles)" Condition="%(CopyFiles.Filter.StartsWith('$(Platform)') And %(CopyFiles.Filter.EndsWith('$(Configuration)')"/>
</ItemGroup>
</Target>
但这从来没有奏效,当我试图找出问题所在时,我发现 %(CopyFiles.Filter)
总是空的,因为 .vcxproj.filters
没有导入到 .vcxproj
文件中。我尝试手动将导入添加到 .vcxproj.filters
文件,但是 Visual Studio 中的过滤器完全搞砸了。
有谁知道在不搞乱 Visual Studio 项目的情况下自动执行此过程的方法吗?
.filters 文件不参与构建过程,但它可以像任何 xml 文件一样被 XmlPeek 任务查询。尝试以下操作:
<Target Name="AddInputsAccordingToFilter">
<XmlPeek Namespaces="<Namespace Prefix='n' Uri='http://schemas.microsoft.com/developer/msbuild/2003'/>"
XmlInputPath="$(MSBuildProjectFile).filters"
Query="/n:Project/n:ItemGroup/n:CopyFiles[starts-with(n:Filter, '$(Platform)')]/@Include">
<Output TaskParameter="Result" ItemName="FilesToCopy" />
</XmlPeek>
<ItemGroup>
<CopyFiles Include="@(FilesToCopy)"/>
</ItemGroup>
</Target>
考虑到此解决方案依赖于未记录的 .filter 文件格式。