2012-04-28 13 views
8

Ho una raccolta di file csproj che fanno tutti riferimento allo stesso insieme di file sorgente, ma hanno dati di destinazione leggermente diversi, quindi devo tenere separati i file di progetto. Per esempio. ci sono varianti WinPhone, XBox, Desktop, MonoTouch dello stesso progetto.File di progetto C# Mulitargeting con Mono e MonoDevelop

Per cose realmente duplicate, come l'elenco di file .cs da compilare, mi piacerebbe consolidare l'elenco in un singolo file, quindi non continuo a dover verificare che tutte le variazioni siano mantenute in sincronia . Inizialmente ho provato a farlo rimuovendo i sorgenti da .csprojs e inserendoli in un file .targets che è stato importato da tutti i csprojs, ma che ha fatto sparire i file di origine sia da VS che da MonoDevelop.

Il mio secondo tentativo è stato quello di rendere il file csproj del desktop quello principale, e lasciare che tutte le varianti importino quel csproj con una qualche logica condizionale. Ciò mantiene i file di origine modificabili dal csproj principale e li costruiscono in tutti i gusti. Ora Visual Studio capisce cosa stavo cercando di fare ma MonoDevelop non può costruirlo. Nella soluzione MonoDevelop la versione iOS della DLL centrale è disattivata e dice "(non integrata nella configurazione attiva"

Ho anche provato xbuilding il csproj e la soluzione, che sembra superare i problemi che MonoDevelop ha ma singhiozzo su altre cose relative alla risoluzione di monotosse. Avevo pensato che MonoDevelop usasse xbuild, ma forse no?

Dato che questo funziona nel msbuild di Windows sembra che sia un bug o una funzione non supportata in Mono. O forse c'è un modo migliore per affrontare l'intero scenario ... Ho pensato di chiedere qui.

Per ulteriori dettagli, Il mio file Core.iOS.csproj assomiglia a questo:

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

E il mio file Core.csproj assomiglia a questo:

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

E, come ho detto, un la variazione di questo sembra funzionare correttamente quando si utilizza VS Express per progetti WinPhone e XBox360. È qualcosa che dovrebbe funzionare? C'è un modo migliore per farlo?

Grazie,

+0

Sembra buono, e Monodevelop usa xbuild internamente. Che versione hai installato? – skolima

+0

Grazie per la ricerca. Mentre stavo ricercando questo per rispondere alla domanda io stesso, avevo avuto l'impressione che i progetti MonoTouch ignorassero xbuild e invocassero direttamente mcs, ma potrei averlo interpretato erroneamente o aver guardato un vecchio articolo, ma anche se fosse il caso, non lo farei so quanto l'IDE userebbe xbuild per decidere quali obiettivi sono validi ... La mia versione di MonoDevelop è 2.8.8.4. Per favore fatemi sapere se c'è qualcosa che posso aiutare se avete bisogno di una riproduzione. –

risposta

9

Risposta breve:

Questo non funziona perché anche se MonoDevelop utilizza il formato di file MSBuild, non usa il vero motore/xbuild MSBuild per tutti i tipi di progetto ancora. Suggerirei di utilizzare collegamenti anziché un inclusivo.

completa di fondo:

MonoDevelop ha un vecchio motore di generazione interna che è derivato dal motore di generazione SharpDevelop 1.0, vale a dire che precede l'esistenza di MSBuild. Stiamo migrando a MSBuild, ma questo ha richiesto diverse fasi e non è ancora completo.

Alcuni anni fa, MonoDevelop ha cambiato il suo progetto in formato file in un sottoinsieme compatibile con Visual Studio di MSBuild. Ciò è stato fatto serializzando/deserializzando le proprietà e gli articoli MSBuild noti nel modello di progetto interno di MD, ma facendo la build usando il vecchio motore di compilazione. Ciò significava che qualsiasi progetto MSBuild che utilizzava solo le funzionalità accessibili dall'interfaccia utente di Visual Studio funzionava correttamente. Tuttavia, non supportava le funzionalità MSBuild più avanzate che sono accessibili solo modificando manualmente l'XML MSBuild.

Successivamente MD ha ottenuto il supporto sperimentale per l'utilizzo del motore di compilazione xbuild/MSBuild, ma al momento xbuild non era maturo e non aveva destinazioni MSBuild per tutti i tipi di progetto. È rimasto sperimentale e il codice di build per i nuovi tipi di progetto (MonoTouch, ecc.) È stato scritto utilizzando il motore di compilazione interno MD.

Mono per Android doveva essere supportato in Visual Studio, quindi doveva avere target MSBuild. Invece di scrivere e mantenere il codice di build per due motori di build, abbiamo completato l'integrazione del motore MSBuild di xbuild e MonoDevelop in modo che potesse essere utilizzato per i progetti Mono per Android. Tuttavia, non è stato possibile abilitare il motore di build xbuild per impostazione predefinita in MD, dal momento che molti altri tipi di progetto non avevano ancora target xbuild. Invece, abbiamo permesso ai componenti aggiuntivi del progetto di forzare l'uso del motore xbuild su una base per tipo di progetto.

Questo è essenzialmente lo stato attuale - il motore xbuild viene utilizzato per Mono per progetti di Android, e nuovi tipi di progetto, quali iPhone Binding progetti e progetti PLP, ed è consigliato per nuovi tipi di progetto. Ma i vecchi tipi di progetto come MonoTouch, MonoMac, ASP.NET ecc non sono ancora stati migrati al momento della scrittura.

+0

È ancora vero con la nuova versione di Xamarin 2? –

+0

Sì. Vedi anche http://mjhutchinson.com/journal/2012/08/19/state_msbuild_support_monodevelop –

+0

Ci sono aggiornamenti su questo nel frattempo? – Sjoerd222888