2012-04-28 2 views
8

나는 모두 동일한 소스 파일 세트를 참조하지만 약간 다른 대상 데이터가 있으므로 프로젝트 파일을 별도로 유지해야하는 csproj 파일 모음이 있습니다. 예 : 동일한 프로젝트의 WinPhone, XBox, Desktop, MonoTouch 변종이 있습니다.Mono 및 MonoDevelop와 함께 다중 타겟 C# 프로젝트 파일

실제로 컴파일되는 .cs 파일 목록과 같이 목록을 단일 파일로 통합하여 모든 유사 콘텐츠가 동기화되어 있는지 확인하지 않아도됩니다. . 원래는 .csprojs에서 소스를 제거하고 모든 csprojs에서 가져온 .targets 파일에 넣었지만 소스 파일을 VS와 MonoDevelop에서 모두 사라지게 만들었습니다.

내 두 번째 시도는 데스크톱 csproj 파일을 기본 파일로 만들고 모든 유사 콘텐츠를 일부 조건부 논리를 사용하여 해당 csproj를 가져 오는 것입니다. 이렇게하면 소스 파일을 기본 csproj에서 편집 할 수 있으며 모든 형식으로 빌드 할 수 있습니다. 이제 Visual Studio는 내가하려고했던 것을 이해하지만 MonoDevelop는 그것을 구축 할 수 없습니다. MonoDevelop 솔루션에서 코어 DLL의 iOS 버전이 회색으로 표시되고 "활성 구성에 내장되어 있지 않습니다"라고 말합니다.

또한 MonoDevelop의 문제점을 해결할 수있는 csproj 및 솔루션을 xbuilding 해본 결과 모노 터치 어셈블리를 해결하는 것과 관련하여 다른 문제가 있습니다. 나는 MonoDevelop가 xbuild를 사용했다고 생각했지만, 그렇지 않을 수도 있습니다.

Windows msbuild에서 작동하므로 Mono에서 버그 또는 지원되지 않는 기능인 것 같습니다. 아니면 전체 시나리오를 해결할 수있는 더 좋은 방법이있을 것입니다.

<?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 파일은 다음과 같습니다 : 세부 사항에 대한

이 내 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> 
    <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는 프로젝트 을 Visual Studio 호환 하위 집합 인 MSBuild로 전환했습니다. 이 작업은 알려진 MSBuild 속성 및 항목을 MD의 내부 프로젝트 모델로 serialize/deserialize하여 수행했지만 이전 빌드 엔진을 사용하여 빌드를 수행하여 수행되었습니다. 즉, Visual Studio UI에서 액세스 할 수있는 기능 만 사용하는 모든 MSBuild 프로젝트가 올바르게 작동했습니다. 그러나 MSBuild XML을 직접 편집하여 액세스 할 수있는 고급 MSBuild 기능은 지원하지 않습니다.

나중에 MD는 xbuild/MSBuild 빌드 엔진을 사용하기위한 실험적 지원을 얻었지만 xbuild는 성숙하지 않았으며 모든 프로젝트 유형에 대해 MSBuild 대상을 갖고 있지 않았습니다. 그것은 실험적인 채로 남아 있었고 새로운 프로젝트 유형 (MonoTouch 등)을위한 빌드 코드는 MD 내부 빌드 엔진을 사용하여 작성되었습니다.

Android 용 모노는 Visual Studio에서 지원되어야하므로 MSBuild 대상을 가져야했습니다. 두 빌드 엔진에 대한 빌드 코드를 작성하고 유지 관리하는 대신 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