8

すべて同じソースファイルのセットを参照するcsprojファイルのコレクションがありますが、ターゲットデータがわずかに異なるため、プロジェクトファイルを分離しておく必要があります。たとえば、同じプロジェクトのWinPhone、XBox、Desktop、MonoTouchのバリアントがあります。

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

2番目の試みは、デスクトップcsprojファイルをプライマリファイルにし、すべてのバリエーションに条件付きロジックを使用してそのcsprojをインポートさせることでした。これにより、ソースファイルがメインのcsprojから編集可能になり、すべてのフレーバーに組み込まれます。これで、Visual Studioは私がやろうとしていたことを理解しましたが、MonoDevelopはそれを構築できません。MonoDevelopソリューションでは、iOSバージョンのコアDLLがグレー表示され、「(アクティブな構成でビルドされていない)」と表示されます。

また、csprojとソリューションをxbuildingしてみました。これは、MonoDevelopが抱えている問題を乗り越えたようですが、monotouchアセンブリの解決に関連する他の問題に問題があります。MonoDevelopがxbuildを使用していると思っていましたが、そうではないでしょうか。

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

具体的には、MyCore.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ファイルは次のようになります。

<?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を使用すると、このバリエーションが正しく機能しているようです。これはうまくいくはずですか?これを行うためのより良い方法はありますか?

ありがとう、

4

1 に答える 1

9

短い答え:

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

完全な背景:

MonoDevelopには、SharpDevelop 1.0ビルドエンジンから派生した古い内部ビルドエンジンがあります。つまり、MSBuildの存在よりも前のものです。現在MSBuildに移行中ですが、これにはいくつかの段階があり、まだ完了していません。

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

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

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

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

于 2012-04-30T03:48:04.597 に答える