我们有一个VS2012 .NET 4产品,它有两个不同的SKU A和B,我们目前仅为x86构建。
我们还有通常的配置Debug
和Release
,这意味着我们目前有4种配置。
查看其中一个.csproj文件,它看起来像这样
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'DebugA|x86' ">
<OutputPath>..\bin\DebugA\</OutputPath>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'ReleaseA|x86' ">
<OutputPath>..\bin\ReleaseA\</OutputPath>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'DebugB|x86' ">
<OutputPath>..\bin\DebugB\</OutputPath>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'ReleaseB|x86' ">
<OutputPath>..\bin\ReleaseB\</OutputPath>
</PropertyGroup>
显然,添加x64会使这个从4到8种不同的组合加倍,而VS似乎也会随时添加AnyCPU平台配置。确保在30多个项目中正确配置所有8个项目需要在VS中进行大量点击,并且很容易出错。
我已经阅读了其他一些SO问题,其中解决了多目标问题,以及在参考路径中使用$ {Platform}涉及的不同平台包含不同参考的建议之一。我想我可以为我的项目配置做类似的事情,所以我在尝试做多平台时尝试了这个:
<PropertyGroup Condition=" '$(Configuration)' == 'DebugA' Or '$(Configuration)' == 'DebugB' ">
<OutputPath>..\bin\${Platform}\${Configuration}\</OutputPath>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'ReleaseA' Or '$(Configuration)' == 'ReleaseB' ">
<OutputPath>..\bin\${Platform}\${Configuration}\</OutputPath>
</PropertyGroup>
理论上,应该只用两个块给我所有8种不同组合所需的东西。但是现在看看VS我看不到neitehr x86和x64作为该项目的可用构建平台。看起来VS实际存储构建平台的唯一方法是将它们编码为属性组中的怪异条件?说它不是......
有没有办法制作一个“漂亮”的多平台.csproj,它可以很好地与VS一起使用?
我可以创建.csprojs然后决定不在VS中编辑它们,相信msbuild将使用正确的平台,即使VS无法在各个项目的属性窗口中显示任何平台吗?
修改
似乎问题有点混乱:要清楚,我想知道如何设置,维护和概述项目的配置,以及我的解决方案的构建配置,当有许多项目和8个组合时配置|平台。我知道如何手动执行此操作,但不是没有失去理智或在200多个属性页面中出错。
答案 0 :(得分:2)
如果您不介意必须手动更改项目文件,那么您可以将所有共享配置放在配置文件中并从每个项目中引用它。为此,您需要先创建配置文件。此文件只是一个普通的MsBuild文件,其中包含您要在所有项目之间共享的所有信息(如构建配置)。该文件看起来大致如下:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="3.5"
DefaultTargets="Build"
xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<!-- VS information -->
<ProductVersion>9.0.30729</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<!-- Default configuration -->
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<!-- Project directories -->
<AppDesignerFolder>Properties</AppDesignerFolder>
<OutputPath>$(SolutionDir)\..\build\bin\$(Platform)\$(Configuration)\</OutputPath>
<IntermediateOutputPath>$(SolutionDir)\..\build\temp\bin\obj\$(AssemblyName)\$(Platform)\$(Configuration)\</IntermediateOutputPath>
<!-- Build configuration -->
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<DefineConstants>TRACE;DEBUG;CODE_ANALYSIS</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<DefineConstants>TRACE;CODE_ANALYSIS</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<DefineConstants>TRACE;DEBUG;CODE_ANALYSIS</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<DefineConstants>TRACE;CODE_ANALYSIS</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<DefineConstants>TRACE;DEBUG;CODE_ANALYSIS</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<DefineConstants>TRACE;CODE_ANALYSIS</DefineConstants>
</PropertyGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>
PropertyGroup
定义了整体常量,即所有项目用于所有构建配置的常量。如您所见OutputPath
,您可以使用$(Platform)
和$(Configuration)
等构建变量来确定二进制文件的位置等。PropertyGroup
也有一堆通常由visual studio定义的设置,例如ProductVersion
。从技术上讲,你不必移动它们,但移动它们确实可以减少项目文件中的混乱。如果你关心它。一旦定义了配置文件,称其为BaseConfigurations.targets
,则必须编辑项目文件。不幸的是,您将不得不浏览所有项目文件,但您只需要执行一次。链接配置文件后,您可以通过更改配置文件来更改所有共享配置。
正常的项目文件看起来大致如下:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{33017F71-5A1C-4113-9041-4DD3F58921D0}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>MyProject</RootNamespace>
<AssemblyName>MyProject</AssemblyName>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Class1.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>
要链接配置文件,您需要:
PropertyGroup
中删除添加第<SolutionDir Condition="'$(SolutionDir)' == '' or '$(SolutionDir)' == '*undefined*'">$(MSBuildProjectDirectory)\..</SolutionDir>
行。如果您只从Visual Studio构建(因为Visual Studio自动定义SolutionDir
变量),则不需要这样做,但如果您还想通过MsBuild构建项目,则必须这样做。这一行还假设每个项目都在它自己的子目录中,并且解决方案文件是每个项目文件中的一个目录,即您的结构类似于:
source
MyProject
MyProject.csproj
MySolution.sln
在第一个PropertyGroup
下方添加以下行<Import Project="$(SolutionDir)\BaseConfiguration.targets" />
。这向MsBuild(以及Visual Studio)指示您要导入配置文件。
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
。这在您的配置文件中定义,因此不再需要。毕竟,您的项目文件应该类似于:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<SolutionDir Condition="'$(SolutionDir)' == '' or '$(SolutionDir)' == '*undefined*'">$(MSBuildProjectDirectory)\..</SolutionDir>
<ProjectGuid>{33017F71-5A1C-4113-9041-4DD3F58921D0}</ProjectGuid>
<OutputType>Library</OutputType>
<RootNamespace>MyProject</RootNamespace>
<AssemblyName>MyProject</AssemblyName>
</PropertyGroup>
<Import Project="$(SolutionDir)\BaseConfiguration.targets" />
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Class1.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>
注意:
答案 1 :(得分:0)
您需要批量构建,您可以在其中选择要运行的不同构建。
您可以使用工具 - &gt;将其映射到键盘快捷键。选项 - &gt;键盘然后搜索Build.BatchBuild
答案 2 :(得分:0)
在我看来,在您的配置名称中组合平台和SKU是不明智的。在您的情况下,我建议仅坚持使用Debug和Release项目配置。您的解决方案应该有一个SKU A项目和一个SKU B的单独项目(共享任何常见文件)。除了两个构建配置之外,每个项目都可以针对x86和x64平台。然后,您可以添加尽可能多的解决方案配置,而无需使单个项目配置更复杂。