.vcxproj
文件和通配符
Visual Studio IDE 不支持在 .vcxproj
文件的项目项中使用某些构造。 这些不受支持的构造包括通配符、分号分隔列表或扩展到多个文件的 MSBuild 宏。 C++ 生成的 .vcxproj
项目系统具有比 MSBuild 更高的限制。 每个项目项都要求有自己的 MSBuild 项。 有关 .vcxproj
文件格式的详细信息,请参阅 .vcxproj
和 .props
文件结构。
IDE 不支持以下构造示例:
<ItemGroup>
<None Include="*.txt">
<ClCompile Include="a.cpp;b.cpp"/>
<ClCompile Include="@(SomeItems)" />
</ItemGroup>
如果在 IDE 中加载包含这些构造的 .vcxproj
项目文件,项目一开始似乎能够正常工作。 但是,在 Visual Studio 修改项目并将其保存在磁盘后,问题可能会立即出现。 可能会遇到随机崩溃和未定义的行为。
在 Visual Studio 2019 版本 16.7 中,当 Visual Studio 加载 .vcxproj
项目文件时,它会自动检测项目项中不支持的条目。 在加载解决方案期间,可在“输出”窗口中看到警告。
Visual Studio 2019 版本 16.7 还增加了只读项目支持。 只读支持允许 IDE 使用手动创作的项目,这些项目对 IDE 可编辑项目没有附加限制。
如果你拥有的 .vcxproj
文件使用一个或多个不受支持的构造,可以使用以下选项之一在 IDE 中加载它而不发出警告:
- 显式列出所有项
- 将项目标记为只读
- 将通配符项移动到目标正文
显式列出所有项
目前,无法在非只读项目的“解决方案资源管理器”窗口中显示通配符扩展项。 解决方案资源管理器需要项目显式列出所有项。
若要使 .vcxproj
项目在 Visual Studio 2019 版本 16.7 或更高版本中自动展开通配符,请将 ReplaceWildcardsInProjectItems
属性设置为 true
。 建议在根目录中创建 Directory.Build.props
文件,并使用以下内容:
<Project>
<PropertyGroup>
<ReplaceWildcardsInProjectItems>true</ReplaceWildcardsInProjectItems>
</PropertyGroup>
</Project>
将项目标记为只读
在 Visual Studio 2019 版本 16.7 及更高版本中,可以将项目标记为只读。 若要将项目标记为只读,请将以下属性添加到 .vcxproj
文件,或将其添加到该文件导入的任何文件:
<PropertyGroup>
<ReadOnlyProject>true</ReadOnlyProject>
</PropertyGroup>
<ReadOnlyProject>
设置可阻止 Visual Studio 编辑和保存项目,以便你可以使用其中的任何 MSBuild 构造,包括通配符。
请务必了解,如果 Visual Studio 检测到 .vcxproj
文件或该文件导入的任何文件的项目项中存在通配符,项目缓存将不可用。 如果有很多项目使用通配符,则 IDE 中的解决方案加载时间会长得多。
将通配符项移动到目标正文
你可能需要使用通配符来收集资源、添加生成的源等。 如果不需要在解决方案资源管理器窗口中列出它们,则可以改用以下过程:
更改项组的名称以添加通配符。 例如,不是:
<Image Include="*.bmp" /> <ClCompile Include="*.cpp" />
而是将其更改为:
<_WildCardImage Include="*.bmp" /> <_WildCardClCompile Include="*.cpp" />
将此内容添加到
.vcxproj
文件。 或者,将其添加到根目录中的Directory.Build.targets
文件,从而影响该根目录下的所有项目:<Target Name="AddWildCardItems" AfterTargets="BuildGenerateSources"> <ItemGroup> <Image Include="@(_WildCardImage)" /> <ClCompile Include="@(_WildCardClCompile)" /> </ItemGroup> </Target>
此更改会使生成发现在
.vcxproj
文件中定义的项。 但是,现在它们在“解决方案资源管理器”窗口中不可见,它们不会在 IDE 中引起问题。若要在编辑器中打开这些文件时显示
_WildCardClCompile
项的正确 IntelliSense,请添加以下内容:<PropertyGroup> <ComputeCompileInputsTargets> AddWildCardItems $(ComputeCompileInputsTargets) </ComputeCompileInputsTargets> </PropertyGroup>
实际上,可以将通配符用于目标正文中的任何项。 还可以在 ProjectSchemaDefinition
未将其定义为项目项的 ItemGroup
中使用通配符。
注意
如果将通配符包含文件从 .vcxproj
文件移动到导入的文件,则它们不会显示在“解决方案资源管理器”窗口中。 此更改还允许在 IDE 中加载项目,而无需对其进行修改。 但是,不建议使用此方法,因为它会禁用项目缓存。