Для Noda Time версии 1.1, основная цель - создать вкус портативной библиотеки классов, в первую очередь для поддержки приложений Windows Phone и Windows Store. Это означает потерю некоторых функций, поэтому мы создаем конфигурацию рабочего стола и конфигурацию PCL (для каждого из отладки, выпуска и "подписанного выпуска" ).
Чтобы избежать необходимости работать с расширенными файлами проекта, все 6 конфигураций существуют в одном файле проекта. Файл проекта настроен для создания свойства "Переносимость" , которое настроено на "PCL" или "Desktop" , например:
<!-- 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>
Затем у нас есть отдельные группы свойств для переносных vs desktop, основанные на вышеуказанном свойстве. Это то, что определяет тип проекта как "библиотека классов" или "портативная библиотека классов" (вместе с OutputType
of Library
, который является общим):
<!-- 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>
Это в целом работает очень хорошо - у меня разные конфигурации решений, поэтому я могу каждый раз создавать и тестировать все, и мне нужно только добавить каждый новый файл .cs
в один файл проекта. Так что в Visual Studio 2012 Professional (это то, что я использую) я совершенно счастлив.
Проблема возникает, когда я пытаюсь загрузить решение в Visual Studio Express (VS2010 или VS2012). Несмотря на то, что решение загружается, он не может с ошибкой сказать, что некоторые проекты не могут быть загружены, а два проекта, которые создают версии PCL, имеют следующий вывод:
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.
(Переформатировано для ясности.) Два проекта отказываются загружать, поэтому вы даже не можете просматривать исходный код.
Я действительно надеялся, что даже если пользователи Express не смогут создавать версии PCL, они все равно смогут загрузить решение, просмотреть исходный код и построить версии, отличные от PCL. MSBuild работает из командной строки, но это не так удобно.
Я попытался удалить конфигурации решений, которые относятся к конфигурациям проекта PCL, и это не помогает. Как ни странно, даже комментируя XML-элемент, например:
<!--
<ProjectTypeGuids>(Guids as before)</ProjectTypeGuids>
-->
не помогает - хотя удаление строки происходит. Как будто Visual Studio фактически не загружает его как настоящий XML файл. (Я не пробовал загружать версию с прокомментированным элементом в VS Pro.)
Я мог бы спуститься по пути создания отдельных файлов проекта PCL, если мне это нужно, но мне бы очень хотелось избежать этого, если это возможно - это сделало бы нормальное развитие более болезненным. Точно так же я мог бы генерировать только PCL и файлы решений Express-only, но опять-таки я бы предпочел - он просто чувствует себя не так.
В идеале я бы хотел поддержать VS Express как в 2010 году, так и в 2012 году, если есть решение, которое работает только в 2012 году, это будет хорошим началом.
Итак, есть ли способ убедить Visual Studio Express, что он действительно может загрузить проект, несмотря на группу условных свойств (условие которой не выполняется), ссылаясь на тип проекта, о котором он не знает?