2012-04-28 11 views
8

私はcsprojファイルのコレクションを持っていますが、すべて同じソースファイルセットを参照していますが、ターゲットデータはわずかに異なります。例えば。同じプロジェクトのWinPhone、XBox、Desktop、MonoTouchの亜種があります。MonoとMonoDevelopを使用したC#プロジェクトファイルのマルチターゲット化

コンパイルする.csファイルのリストのように、実際に複製されているものについては、リストを1つのファイルにまとめて、すべてのパターンが同期していることを確認する必要はありません。私はもともと.csprojsからソースを削除して、すべてのcsprojsによってインポートされた.targetsファイルにそれらを入れてみましたが、ソースファイルはVSとMonoDevelopの両方から消えました。

私の2回目の試みは、Desktop csprojファイルを主なものにし、すべてのバリエーションがいくつかの条件付きロジックでそのcsprojをインポートするようにすることでした。これにより、ソースファイルはメインのcsprojから編集可能になり、すべてのフレーバに組み込まれます。今私は何をしようとしていたのですが、MonoDevelopはビルドできません。 MonoDevelopソリューションでは、コアDLLのiOSバージョンがグレー表示され、「(アクティブな構成ではビルドされていません」)

また、MonoDevelopが持つ問題を乗り越えていると思われるcsprojとソリューションをxbuildingモノトックアセンブリを解決することに関連する他の事にはちょっとした問題があります。私はMonoDevelopがxbuildを使用していると思っていましたが、おそらくそうではありませんか?

これはWindows msbuildで動作するため、Monoではバグかサポートされていない機能のようです。あるいは、シナリオ全体に取り組むより良い方法があるかもしれません...私はここで尋ねると思っていました。詳細については

、 マイCore.iOS.csprojファイルは次のようになります。

<?xml version="1.0" encoding="utf-8"?> 
<Project 
    xmlns="http://schemas.microsoft.com/developer/msbuild/2003" 
    DefaultTargets="Build" 
    ToolsVersion="4.0" > 
    <PropertyGroup> 
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> 
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> 
    <ProductVersion>10.0.0</ProductVersion> 
    <SchemaVersion>2.0</SchemaVersion> 
    <ProjectGuid>{AE37B15F-F4BE-48DE-9F20-F00A601EC89E}</ProjectGuid> 
    <ProjectTypeGuids>{6BC8ED88-2882-458C-8E55-DFD12B67127B};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids> 
    <AssemblyName>Core.iOS</AssemblyName> 
    </PropertyGroup> 
    <ItemGroup> 
    <Reference Include="System" /> 
    <Reference Include="System.Core" /> 
    <Reference Include="monotouch" /> 
    </ItemGroup> 
    <Import Project=".\Core.csproj" /> 
    <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> 
</Project> 

そして、私のCore.csprojファイルは次のようになります。私は、A、言ったように、

<?xml version="1.0" encoding="utf-8"?> 
<Project 
    xmlns="http://schemas.microsoft.com/developer/msbuild/2003" 
    DefaultTargets="Build" 
    ToolsVersion="4.0"> 
    <PropertyGroup> 
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> 
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> 
    <OutputType>Library</OutputType> 
    <AppDesignerFolder>Properties</AppDesignerFolder> 
    <RootNamespace>Core</RootNamespace> 
    </PropertyGroup> 
    <!-- Using AssemblyName's presence to check for whether this is imported. --> 
    <PropertyGroup Condition=" '$(AssemblyName)' == '' "> 
    <ProductVersion>8.0.50727</ProductVersion> 
    <SchemaVersion>2.0</SchemaVersion> 
    <ProjectGuid>{FC495BD8-11B1-46B0-A9DE-F245A0CBEE94}</ProjectGuid> 
    <AssemblyName>Core</AssemblyName> 
    <SignManifests>false</SignManifests> 
    </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' "> 
    <!-- properties similar to Debug --> 
    </PropertyGroup> 
    <ItemGroup Condition=" '$(Platform)' == 'AnyCPU' "> 
    <Reference Include="System" /> 
    <Reference Include="System.Core" /> 
    </ItemGroup> 
    <Import Condition=" '$(AssemblyName)' == 'Core' " Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> 
    <ItemGroup> 
    <Compile Include="[...]" /> 
    <Compile Include="[...]" /> 
    </Project> 

そして、 WinPhoneとXBox360プロジェクトにVS Expressを使用すると、これのバリエーションが正しく動作しているようです。これはうまくいくはずですか?これを行うより良い方法はありますか?

おかげで、

+0

いいね、Monodevelopは内部的にxbuildを使用します。どのバージョンをインストールしましたか? – skolima

+0

ありがとう。 MonoTouchプロジェクトがxbuildをバイパスしてmcsを直接呼び出すという印象を受けましたが、私はそれを誤読したり古い記事を見ているかもしれませんが、たとえそうであったとしても、どのターゲットが有効であるかを決定するためにIDEがxbuildをどれだけ使用するか知っています...私のMonoDevelopのバージョンは2.8.8.4です。もしあなたがレプロを必要とするなら、私が助けることができるものがあれば教えてください。 –

答えて

9

短い答え:

MonoDevelopのは、MSBuildのファイル形式を使用しているが、それはまだ、すべてのプロジェクトタイプのための本当のMSBuild/xbuildエンジンを使用していないので、これは動作しません。私はインクルードの代わりにリンクを使うことをお勧めします。

全背景:

MonoDevelopのはSharpDevelopの1.0ビルドエンジン由来の古い内部ビルドエンジン、すなわちそれはMSBuildのの存在に先行しています。私たちはMSBuildに移行中ですが、これはいくつかの段階を踏んでおり、まだ完了していません。

数年前、MonoDevelopは、プロジェクトのファイル形式をMSBuildのVisual Studio互換サブセットに切り替えました。これは、既知のMSBuildのプロパティと項目をMDの内部プロジェクトモデルにシリアライズ/デシリアライズすることによって行われましたが、古いビルドエンジンを使用してビルドを行いました。これは、Visual Studio UIからアクセス可能な機能しか使用していないMSBuildプロジェクトが正常に動作したことを意味していました。ただし、MSBuild XMLを手で編集するだけでアクセス可能な、より高度なMSBuild機能はサポートしていませんでした。

その後、xbuild/MSBuildビルドエンジンを使用するための実験的サポートが得られましたが、xbuildは成熟しておらず、すべてのプロジェクトタイプのMSBuildターゲットがありませんでした。これは実験的なままであり、新しいプロジェクトタイプ(MonoTouchなど)のビルドコードは、MD内部ビルドエンジンを使用して書かれました。

Android用のMonoはVisual Studioでサポートする必要があったため、MSBuildターゲットが必要でした。 2つのビルドエンジン用のビルドコードを作成して管理するのではなく、xbuildとMonoDevelopのMSBuildエンジン統合を終了し、Androidプロジェクト用のMonoに使用できるようにしました。しかし、他の多くのプロジェクトタイプがまだxbuildターゲットを持っていなかったので、MDでデフォルトでxbuildビルドエンジンを有効にすることはできませんでした。代わりに、プロジェクトアドインがxbuildエンジンをプロジェクトごとに強制的に使用できるようにしました。

これは本質的に現在の状態です.xbuildエンジンは、Androidプロジェクト用のMono、iPhone BindingプロジェクトやPLPプロジェクトなどの新しいプロジェクトタイプで使用され、新しいプロジェクトタイプにおすすめです。 MonoTouch、MonoMac、ASP.NETなどの古いプロジェクトタイプは、まだ書面の時点では移行されていません。

+0

新しいXamarin 2リリースでこれは本当ですか? –

+0

はい。 http://mjhutchinson.com/journal/2012/08/19/state_msbuild_support_monodevelop –

+0

も参照してください。 – Sjoerd222888

関連する問題