Dan*_*ann 5 msbuild visual-studio
我有一个包含数百个C ++和C#项目的解决方案。我不能使用MSBuild直接构建具有不同类型项目依赖项的任何单个项目,因为有效配置(Deubg / Release)和平台(Win32 / AnyCPU / x64)设置对于不同项目类型是不同的。
例如,如果我有一个C ++项目“ CppProj1”依赖于C#项目“ CsharpProj1”,则我无法通过在命令行上指定Release / AnyCPU来使用MSBuild编译CppProj1,因为CppProj1无法在未知平台类型上进行编译。同样,指定Release / Win32将导致CsharpProj1编译失败。Visual Studio通过在每个解决方案文件中存储配置/平台设置的映射来解决此问题,但是使用MSBuild的巨大动机是将构建过程与Visual Studio IDE分离。有没有不使用VS解决方案文件就可以解决此问题的方法?
有很多方法可以做到这一点。“MSBuild Trickery”(技巧#19、#80、#104)一书中的十几页内容涵盖了所有这些内容的彻底解释,但我将在这里总结基本机制。
这些技巧对AdditionalProperties 元数据进行了讨论。为项目创建项目数组,并为 Platform 属性指定AdditionalProperties 元数据,该元数据将在使用 MSBuild 任务生成项目时使用。
在您的构建的属性文件中...
<ItemGroup>
<Project Include="./Folder1/Project1.csproj" />
<Project Include="./Folder2/Project2.vcxproj" />
...
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)
在构建目标中...
<ItemGroup>
<Project>
<AdditionalProperties
Condition="'%(Extension)' == '.csproj'">
>Platform=AnyCPU</AdditionalProperties>
<AdditionalProperties
Condition="'%(Extension)' == '.vcxproj'">
>Platform=Win32</AdditionalProperties>
<Project>
</ItemGroup>
<MSBuild Projects=@(Project) ... />
Run Code Online (Sandbox Code Playgroud)
除此之外,您还可以添加 32 位与 64 位的检测。
在公共导入的属性文件中,声明您自己的 $(__Platform) 属性,该属性派生自 $(Platform) 的值,与上面类似,这会创建“平台”的“规范化”概念以在其余部分中引用。项目。这也适用于解决方案构建。
<PropertyGroup>
<__Platform
Condition="'$(Platform)' == 'Win32'>Win32</__Platform>
<__Platform
Condition="'$(Platform)' == 'Win64'>Win64</__Platform>
<__Platform
Condition="'$(Platform)' == 'x32'>Win32</__Platform>
<__Platform
Condition="'$(Platform)' == 'x64'>Win64</__Platform>
</PropertyGroup>
<PropertyGroup
Condition="'$(Platform)' == 'AnyCPU'">
<__Platform
Condition="'$(PROCESSOR_ARCHITECTURE)' == 'x86'>Win32</__Platform>
...etc...
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)
...然后,对于不同的项目文件类型,进行使用该值的自定义导入...
<!-- for C# projects -->
<PropertyGroup>
<OutputPath>bin\$(__Platform).$(Configuration)\</OutputPath>
<IntermediateOutputPath>obj\$(__Platform)...
<!-- for C++ projects -->
<PropertyGroup>
<OutDir>bin\$(__Platform).$(Configuration)\</OutDir>
<IntDir>obj\$(__Platform)...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1935 次 |
| 最近记录: |