2012-04-28 14 views
8

Mam kolekcję plików csproj, które wszystkie odnoszą się do tego samego zestawu plików źródłowych, ale mają nieco inne dane docelowe, dzięki czemu muszę zachować oddzielne pliki projektu. Na przykład. istnieją wersje WinPhone, XBox, Desktop, MonoTouch tego samego projektu.Pliki projektu Mulitalking C# z Mono i MonoDevelop

Rzeczy naprawdę powielone, takie jak lista plików .cs do kompilacji, chcę skonsolidować listę w jeden plik, więc nie muszę się upewnić, że wszystkie odmiany są zsynchronizowane . Początkowo próbowałem to zrobić, usuwając źródła z .csprojs i umieszczając je w pliku .targets, który został zaimportowany przez wszystkie csprojs, ale to spowodowało, że pliki źródłowe zniknęły z VS i MonoDevelop.

Moja druga próba polegała na tym, że główny plik csproj na pulpicie został zainstalowany, a wszystkie warianty zaimportowały csproj z pewną logiką warunkową. Dzięki temu pliki źródłowe są edytowalne z głównego csproj i są wbudowane we wszystkie smaki. Teraz Visual Studio rozumie, co próbowałem zrobić, ale MonoDevelop nie może go zbudować. W rozwiązaniu MonoDevelop wersja rdzennej biblioteki DLL dla systemu iOS jest wyszarzona i mówi "(nie jest wbudowana w aktywną konfigurację)"

Próbowałem także xbuilding csproj i rozwiązania, które wydaje się ominąć problemy, które MonoDevelop ma ale czkawka dotycząca innych rzeczy związanych z rozwiązywaniem zespołów monotouch. Myślałem, że MonoDevelop używał xbuilda, ale może nie?

Ponieważ działa to w msbuild systemu Windows, wygląda na to, że jest to albo błąd, albo funkcja nieobsługiwana w Mono. A może jest lepszy sposób, aby poradzić sobie z całym scenariuszem ... Myślałem, że zapytam tutaj.

Do specyfiki, Mój plik Core.iOS.csproj wygląda następująco:

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

A mój plik Core.csproj wygląda następująco:

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

I jak ja powiedziałem, Wariacja ta wydaje się działać poprawnie podczas korzystania z VS Express dla projektów WinPhone i XBox360. Czy to coś powinno działać? Czy jest lepszy sposób to zrobić?

Dzięki,

+0

Wygląda dobrze, a Monodevelop wewnętrznie używa xbuild. Jaką wersję zainstalowałeś? – skolima

+0

Dzięki za spojrzenie. Kiedy szukałem tego, by odpowiedzieć na to pytanie osobiście, odniosłem wrażenie, że projekty MonoTouch ominęły xbuild i bezpośrednio wywołały mcs, ale mogłem błędnie je odczytać lub zaglądać do starego artykułu, ale nawet jeśli tak było, nie robię tego. t wie, ile IDE wykorzysta xbuild do określenia, które cele są ważne ... Moja wersja MonoDevelop to 2.8.8.4. Daj mi znać, jeśli jest coś, w czym mogę pomóc, jeśli potrzebujesz repro. –

Odpowiedz

9

Krótka odpowiedź:

To nie zadziała, bo chociaż MonoDevelop wykorzystuje format pliku MSBuild, nie używa prawdziwego MSBuild silnik/xbuild dla wszystkich typów projektów jeszcze. Sugerowałbym użycie linków zamiast załączników.

Pełny tła:

MonoDevelop ma stary silnik kompilacji, który jest pochodzący z kompilacji silnika SharpDevelop 1.0, tj to poprzedza istnienie MSBuild. Jesteśmy w trakcie migracji do MSBuild, ale to trwało kilka etapów i nie jest jeszcze kompletne.

Kilka lat temu MonoDevelop zamienił swój projekt w formacie pliku na podzbiór Visual Studio kompatybilny z MSBuild. Dokonano tego poprzez serializację/deserializację znanych właściwości i elementów MSBuild do wewnętrznego modelu projektu MD, ale wykonanie kompilacji przy użyciu starego silnika kompilacji. Oznaczało to, że wszelkie projekty MSBuild, które używały tylko funkcji dostępnych z interfejsu Visual Studio, działały dobrze. Jednak nie obsługuje bardziej zaawansowanych funkcji MSBuild, które są dostępne tylko poprzez ręczną edycję kodu MSBuild XML.

Później MD uzyskał eksperymentalne wsparcie dla silnika budującego xbuild/MSBuild, ale w czasie, gdy xbuild nie był dojrzały i nie miał celów MSBuild dla wszystkich typów projektów. Pozostało ono eksperymentalne, a kod budowy dla nowych typów projektów (MonoTouch itp.) Został napisany przy użyciu wbudowanego silnika MD.

Mono dla systemu Android musiały być obsługiwane w Visual Studio, więc musiał mieć cele MSBuild. Zamiast pisać i utrzymywać kod kompilacji dla dwóch budowanych silników, skończymy integrację silnika Xbuild i MonoDevelop na MSBuild, aby mógł on być użyty w projektach Mono dla Androida. Jednak nie mogliśmy domyślnie włączyć mechanizmu budowania xbuild w MD, ponieważ wiele innych typów projektów nie ma jeszcze obiektów docelowych xbuild. Zamiast tego pozwoliliśmy, aby dodatki do projektów wymusiły użycie mechanizmu xbuild na podstawie typu projektu.

Jest to zasadniczo obecny stan - silnik xbuild jest używany do projektów Mono dla Androida i nowsze typy projektów, takie jak projekty wiązania iPhone i projekty PLP, i jest zalecany dla nowych typów projektów. Jednak starsze typy projektów, takie jak MonoTouch, MonoMac, ASP.NET itp., Nie zostały jeszcze zmigrowane w momencie pisania.

+0

Czy to nadal prawda w nowej wersji Xamarin 2? –

+0

Tak. Zobacz również http://mjhutchinson.com/journal/2012/08/19/state_msbuild_support_monodevelop –

+0

Czy są jakieś aktualizacje na ten temat w międzyczasie? – Sjoerd222888

Powiązane problemy