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,
Se ve bien, y Monodevelop usa el xbuild internamente. ¿Qué versión tienes instalada? – skolima
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. –