msbuild - ¿Puedo obtener un proyecto de biblioteca de clase "a veces portátil" para cargar en Visual Studio Express?
visual-studio-express portable-class-library (2)
Como se responde aquí:
Visual Studio 2012 Express con biblioteca de clases portátil?
y aquí:
Funcionalidad compartida mediante bibliotecas de clases portátiles
Los proyectos de la biblioteca de clase portátil no son compatibles con el SKU expreso ... necesitan un SKU más alto para el soporte completo. Por supuesto, el binario (por ejemplo, usándolo como referencia) es, simplemente, no el soporte de proyecto / fuente.
Me imagino que hay una razón simple para eso: hay diferentes tipos de ediciones de VS2012 Express: para el desarrollo de Windows Phone, para las aplicaciones de escritorio, para las aplicaciones de Windows 8 ... Apuesto a que la edición de Windows Phone Express no conoce el Windows Phone. tipo de proyecto y viceversa. Esta podría ser la razón simple por la cual las PCL tampoco son compatibles.
Aunque la idea de Portable Class Libraries es muy buena, todavía es bastante limitada en muchos sentidos, por ejemplo, hasta donde yo sé, no se puede usar la compilación condicional usando #if xy. Si realmente tiene que usar Visual Studio Express para el desarrollo, entonces podría ser mejor usar proyectos para cada plataforma con los archivos de origen referenciados y la compilación condicional.
Para Noda Time versión 1.1, el objetivo principal es crear un sabor de Biblioteca de clases portátil, principalmente para admitir aplicaciones Windows Phone y Windows Store. Esto significa perder alguna funcionalidad, por lo que creamos una configuración de escritorio y una configuración PCL (para cada una de depuración, versión y "versión firmada").
Para evitar tener que trabajar con innumerables archivos de proyecto, todas las 6 configuraciones existen en el mismo archivo de proyecto. El archivo del proyecto está personalizado para generar una propiedad llamada "Portabilidad", que se configura como "PCL" o "Escritorio", de esta manera:
<!-- Set the custom Portability property based on configuration -->
<PropertyGroup>
<Portability Condition="''$(Configuration)'' == ''Debug Portable''">PCL</Portability>
<Portability Condition="''$(Configuration)'' == ''Release Portable''">PCL</Portability>
<Portability Condition="''$(Configuration)'' == ''Signed Release Portable''">PCL</Portability>
<!-- Default to desktop if not explicitly set above -->
<Portability Condition="''$(Portability)'' == ''''">Desktop</Portability>
</PropertyGroup>
Luego tenemos grupos de propiedades separados para portátil vs escritorio, basados en la propiedad anterior. Esto es lo que define el tipo de proyecto como "biblioteca de clases" o "biblioteca de clases portátil" (junto con OutputType
of Library
, que se comparte):
<!-- Desktop-specific properties -->
<PropertyGroup Condition="''$(Portability)'' == ''Desktop''">
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
<TargetFrameworkProfile>Client</TargetFrameworkProfile>
</PropertyGroup>
<!-- PCL-specific properties -->
<PropertyGroup Condition="''$(Portability)'' == ''PCL''">
<MinimumVisualStudioVersion>10.0</MinimumVisualStudioVersion>
<ProjectGuid>{c78f6992-28d7-45c9-a4c1-6eaa649f3247}</ProjectGuid>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<TargetFrameworkProfile>Profile2</TargetFrameworkProfile>
<ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
</PropertyGroup>
En general, esto funciona muy bien. Tengo las diferentes configuraciones de soluciones, así que puedo crear y probar todo en cualquier momento, y solo necesito agregar cada nuevo archivo .cs
a un solo archivo de proyecto. Entonces, en Visual Studio 2012 Professional (que es lo que uso), estoy muy contento.
El problema surge cuando intento cargar la solución en Visual Studio Express (ya sea VS2010 o VS2012). Mientras se carga la solución, falla con un error al decir que algunos proyectos no se pueden cargar, y los dos proyectos que compilan versiones de PCL tienen un resultado de compilación como este:
C:/Path/To/NodaTime.csproj : error :
The project file ''C:/Path/To/NodaTime.csproj'' cannot be opened.
There is a missing project subtype.
Subtype: ''{786C830F-07A1-408B-BD7F-6EE04809D6DB}''
is unsupported by this installation.
(Reformateado para mayor claridad). Los dos proyectos se niegan a cargarse, por lo que ni siquiera puedes navegar por el código fuente.
Realmente había esperado que, incluso si los usuarios de Express no pudieran construir las versiones de PCL, todavía podrían cargar la solución, explorar el origen y construir versiones que no sean PCL. MSBuild funciona desde la línea de comandos, pero no es tan amigable.
Intenté eliminar las configuraciones de la solución que hacen referencia a las configuraciones del proyecto PCL, y eso no ayuda. Curiosamente, incluso comentando el elemento XML, así:
<!--
<ProjectTypeGuids>(Guids as before)</ProjectTypeGuids>
-->
no ayuda, aunque borrar la línea sí lo hace. Es como si Visual Studio no estuviera realmente cargándolo como un archivo XML real. (No he intentado cargar la versión con el elemento comentado en VS Pro).
Podría ir por la ruta de generar archivos de proyecto PCL por separado si fuera necesario, pero realmente me gustaría evitarlo si es posible; el desarrollo normal sería más doloroso. Del mismo modo, podría generar archivos PCL y de solución Express-only, pero prefiero no hacerlo, simplemente se siente mal.
Aunque idealmente me gustaría apoyar VS Express tanto en 2010 como en 2012, si hay una solución que solo funciona para 2012, sería un buen comienzo.
Entonces, ¿hay alguna manera de convencer a Visual Studio Express de que realmente puede cargar un proyecto a pesar de un grupo de propiedades condicional (cuya condición no se cumple) refiriéndose a un tipo de proyecto que desconoce?
El comentario de David Kean aquí me dio la respuesta que estoy usando por el momento:
o elimine por completo el elemento <ProjectTypeGuid>: esto le permitirá optar por mejoras "portátiles", como una interfaz de usuario para cambiar el marco objetivo, etc.
Lo he intentado, y funciona como un sueño. En máquinas que tienen todo correctamente instalado, ¡puede incluso construir la versión PCL en Express! Verifiqué que el binario resultante realmente es una PCL, y parece estar bien.
No me sorprendería descubrir que me encontré con algunos problemas más adelante, pero por el momento esto funciona bien para mí. Puedo vivir fácilmente sin las mejoras en Visual Studio; ya estaba confundido porque mi proyecto tenía configuraciones de compilación muy diferentes, así que no creo que obtuviera mucho beneficio de todos modos.