2012-04-28 16 views
8

Tengo una colección de archivos csproj que se refieren al mismo conjunto de archivos fuente, pero tienen datos de destino ligeramente diferentes, por lo que necesito mantener los archivos del proyecto separados. P.ej. hay variantes WinPhone, XBox, Desktop, MonoTouch del mismo proyecto.Mulitargeting C# archivos de proyecto con Mono y MonoDevelop

Para las cosas que realmente están duplicadas, como la lista de archivos .cs para compilar, me gustaría consolidar la lista en un solo archivo para no tener que asegurarme de que todas las variaciones se mantengan sincronizadas . Intenté hacerlo al eliminar las fuentes de .csprojs y ponerlas en un archivo .targets importado por todos los csprojs, pero eso hizo que los archivos fuente desaparecieran tanto de VS como de MonoDevelop.

Mi segundo intento fue hacer que el archivo csproj de escritorio fuera el primario, y dejar que todas las variaciones importasen ese csproj con alguna lógica condicional. Esto mantiene los archivos fuente editables desde el csproj principal y se integran en todos los sabores. Ahora Visual Studio entiende lo que estaba tratando de hacer, pero MonoDevelop no puede construirlo. En la solución MonoDevelop, la versión iOS de la DLL principal está en gris y dice "(no está integrada en la configuración activa)"

También intenté xbuilding el csproj y la solución, que parece superar los problemas que tiene MonoDevelop pero hipo sobre otras cosas relacionadas con la resolución de montajes monotouch. Pensé que MonoDevelop usaba xbuild, ¿pero quizás no?

Dado que esto funciona en Windows msbuild, parece que es un error o una característica no compatible en Mono. O tal vez hay una mejor manera de abordar todo el escenario ... Pensé que podría preguntar aquí.

Para obtener detalles específicos, Mi archivo Core.iOS.csproj se parece a esto:

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

Y mi archivo Core.csproj se parece a esto:

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

Y, como he dicho, una La variación de esto parece estar funcionando correctamente al usar VS Express para proyectos WinPhone y XBox360. ¿Es esto algo que debería funcionar? ¿Hay una mejor manera de hacer esto?

Gracias,

+0

Se ve bien, y Monodevelop usa el xbuild internamente. ¿Qué versión tienes instalada? – skolima

+0

Gracias por mirar. Mientras investigaba esto para responder la pregunta yo mismo, tuve la impresión de que los proyectos MonoTouch omitían xbuild e invocaban mcs directamente, pero es posible que lo haya leído mal o que haya estado mirando un artículo anterior, pero incluso si ese fuera el caso, no lo haría. Saber cuánto usaría el IDE xbuild para decidir qué objetivos son válidos ... Mi versión de MonoDevelop es 2.8.8.4. Por favor, avíseme si hay algo con lo que pueda ayudar si necesita una repro. –

Respuesta

9

Respuesta corta:

Esto no funcionará porque aunque MonoDevelop utiliza el formato de archivo de MSBuild, que no utiliza el verdadero motor/xbuild MSBuild para todos los tipos de proyectos todavía. Sugeriría usar enlaces en lugar de incluir.

fondo completo:

MonoDevelop tiene un viejo motor de generación interna que se deriva de la acumulación del motor SharpDevelop 1.0, es decir que es anterior a la existencia de MSBuild. Estamos en el proceso de migrar a MSBuild, pero esto ha tomado varias etapas y aún no está completo.

Hace unos años, MonoDevelop cambió su formato de archivo al a un subconjunto compatible con Visual Studio de MSBuild. Esto se hizo serializando/deserializando propiedades y elementos conocidos de MSBuild en el modelo de proyecto interno de MD, pero haciendo la compilación usando el motor de compilación anterior. Esto significaba que cualquier proyecto de MSBuild que solo utilizara funciones accesibles desde la UI de Visual Studio funcionaba bien. Sin embargo, no admitía las características más avanzadas de MSBuild a las que solo se puede acceder editando manualmente el MSBuild XML.

Posteriormente, MD obtuvo soporte experimental para usar el motor de compilación xbuild/MSBuild, pero en el momento en que xbuild no estaba maduro, y no tenía objetivos MSBuild para todos los tipos de proyectos. Se mantuvo experimental, y el código de compilación para los nuevos tipos de proyectos (MonoTouch, etc.) se escribió utilizando el motor de compilación interno MD.

Mono para Android necesitaba ser compatible con Visual Studio, por lo que tenía que tener objetivos MSBuild. En lugar de escribir y mantener el código de compilación para dos motores de compilación, terminamos la integración del motor de MSbuild y Xbuild de MonoDevelop, por lo que podría usarse para proyectos Mono para Android. Sin embargo, no pudimos habilitar el motor de compilación xbuild de forma predeterminada en MD, ya que muchos otros tipos de proyectos aún no tenían objetivos xbuild. En cambio, permitimos que los complementos del proyecto forzaran el uso del motor xbuild por tipo de proyecto.

Este es esencialmente el estado actual: el motor xbuild se utiliza para proyectos Mono y Android, y tipos de proyectos más nuevos, como proyectos de unión de iPhone y proyectos PLP, y se recomienda para nuevos tipos de proyectos. Pero los tipos de proyectos más antiguos como MonoTouch, MonoMac, ASP.NET, etc. aún no se han migrado en el momento de la escritura.

+0

¿Sigue siendo cierto con la nueva versión de Xamarin 2? –

+0

Sí. Consulte también http://mjhutchinson.com/journal/2012/08/19/state_msbuild_support_monodevelop –

+0

¿Hay actualizaciones al respecto? – Sjoerd222888

Cuestiones relacionadas