2013-04-10 2 views
8

現在、2つの異なるSKUのAとBを持つVS2012 .NET 4製品があります。 通常の設定DebugReleaseもあり、現在4つの設定があります。x86とx64用のVS2012ソリューションを同時に構成する方法

  • DEBUGA
  • DebugBストアドプロシージャ
  • ReleaseA
  • ReleaseBそれはx64のは倍増する追加明らかにこれ

    <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> 
    

    のようになります.csprojファイルのいずれかに探し

これは4つから8つの異なる組み合わせからなり、 VSはAnyCPUプラットフォームの設定を追加するようにも見えます。すべての8つが30以上のプロジェクトで正しく構成されていることを確認するには、VSで多くのクリックが必要です。間違いを犯すのは本当に簡単です。

マルチターゲティングの問題が解決されている他のいくつかの質問を読んでいます。また、参照パスに$ {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> 

理論的には、私はちょうど2つを持つすべての8つの異なる組み合わせのために必要なものを私に与えるべきです、ブロック。しかし、今VSを見て、私はneitehr x86とx64をプロジェクトの利用可能なビルドプラットフォームとして見ることができません。 VSが実際にビルドプラットフォームを格納する唯一の方法は、プロパティグループの厄介な条件としてエンコードすることです。そうではないと言ってください...

VSとうまく動作する「すばらしい」マルチプラットフォームの.csprojを作成する方法はありませんか?

VSが各プロジェクトのプロパティウィンドウにプラットフォームを表示できないのに、msbuildが正しいプラットフォームを使用すると信じて、.csprojsを作成してVSで編集しないことにしましたか?

編集:

questonは少し混乱だったようだ。明確にするために、私は、セットアッププロジェクトの構成を維持し、概要、および私の解決策のビルド構成する方法を知りたいです、多くのプロジェクトと8つのconfig | platformの組み合わせがある場合私は手動でこれを行う方法を知っていますが、私の心を失うことなく、または200 +プロパティページの1つでミスを犯すことはありません。

+0

"設定、管理、概要"からあなたが望むものを明確にし、今日挑戦しているものを明確にする必要があると思います。 –

+0

(config、platform、project)の1つの組み合わせのプロパティは、1つの低速読み込みダイアログページで設定されます。これは100以上の組み合わせを持つ行列であることが多いため、これは面倒でエラーが発生しやすいです。私は効率的にそれを維持するためには、すべての構成を1つのマトリックスで見る必要があります。または、例のように変数を使用して構成された組み合わせの数を制限する方法が必要です。 –

答えて

0

実行したい別のビルドを選択できるバッチビルドが必要です。

enter image description here

あなたはツールをキーボードショートカットにこれをマッピングすることができます - >オプション - >キーボードその後、私の意見では、それはあなたの設定名にプラットフォームとSKUを組み合わせることが賢明だBuild.BatchBuild

+0

複数のビルドを実行しているだけでは機能しませんか?私の質問は、繰り返しやエラーが起こりやすい作業をせずに、ビルドの大きなマトリックスをセットアップして維持する方法です。バッチビルドは、8つの構成/プラットフォームの組み合わせを持つ巨大なソリューションのためにslnとcsprojファイルをセットアップして概要を知るのに役立ちますか? –

0

を検索します。あなたの場合、私はデバッグとリリースプロジェクトの設定だけに固執することをお勧めします。ソリューションには、SKU A用のプロジェクトとSKU B用の別のプロジェクト(共通ファイルの共有)が必要です。各プロジェクトは、2つのビルド構成に加えて、x86およびx64プラットフォームをターゲットにすることができます。個々のプロジェクト構成をそれ以上複雑にすることなく、管理したい数のソリューション構成を追加できます。

+0

SKU:sは、それらを分けるわずかなコンパイルシンボルだけで98%の等価コードであり、数千のクラスを持つ30のプロジェクトがあります。だから私はそれを別のSKUに複製するのは現実的ではないと思います。例えば、コンパイルする多くの大きなライブラリでどのように動作するかと比較してください。 #if SILVERLIGHTを使用してSilverlight/Desktop/Winphoneの設定を変更します。 –

+1

明らかに、プラットフォームはプラットフォームです。 "x86"と "x64"であり、通常はフレームワーク:silverlight/desktop/phone、sku:pro/lite、buildtype:debug/releaseなどの設定を行う必要があります。 –

+0

私はあなたが何を意味したのか理解しています。複数のプロジェクトがソリューションを構成する最も効果的な方法ですが、別のアプローチを追求する理由があるように思えます。 –

2

プロジェクトファイルを手動で1回変更する必要がなければ、すべての共有構成を構成ファイルに入れ、各プロジェクトから参照することができます。これを行うには、最初に設定ファイルを作成する必要があります。このファイルは通常の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という)、プロジェクトファイルを編集する必要があります。残念ながら、すべてのプロジェクトファイルを調べなければなりませんが、これは一度だけ行う必要があります。設定ファイルをリンクした後、設定ファイルを変更してすべての共有設定を変更します。既に定義されている最初のPropertyGroupから削除

  • :あなたがする必要があります設定ファイルをリンクするために

    <?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> 
    

    通常のプロジェクトファイルは、おおよそ次のようになります。あなたの設定ファイル

  • <SolutionDir Condition="'$(SolutionDir)' == '' or '$(SolutionDir)' == '*undefined*'">$(MSBuildProjectDirectory)\..</SolutionDir>を追加してください。これは、Visual Studioからビルドする場合(Visual Studioは自動的にSolutionDir変数を定義するため)は必要ありませんが、MsBuildを使用してプロジェクトをビルドする場合には必要です。ただ、最初のPropertyGroup以下

    source 
        MyProject 
         MyProject.csproj 
        MySolution.sln 
    
  • は、次の行を追加します。この行は、各プロジェクトは、それ自身のサブディレクトリにあることと、ソリューションファイルは、各プロジェクトのファイルから1つのディレクトリアップであることを前提としていつまり、あなたの構造は何かに似ています<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> 
    

    注:

    • あなたは、このアプローチに従っている場合Visual Studioは、すべての異なるビルド構成を認識し、あなたができるようにする必要があり

    すべてこの後、あなたのプロジェクトファイルは次のようになります正しいものを選択してください。特定のソリューション構成からプロジェクトを組み込むか、または除外するには、ソリューションの「構成マネージャー」に移動する必要があります。

  • この方法では、プロジェクトのプロパティページでグローバルに定義されたプロパティを変更することはできません。設定ファイルに変更を加える必要があります。設定ファイルは、すべての単一プロジェクトのプロパティに反映されます。
  • Visual Studio 2010以前を使用している場合は、構成ファイルを変更した場合、Visual Studio 2010はファイルを含む変更を検出しないため、ソリューションを再読み込みする必要があります。 Visual Studio 2012は、ファイルをインクルードするための変更を検出できるはずです。
関連する問題