Каковы мои варианты совместного использования кода между проектами DNX/ASP.NET 5 (project.json/xproj) и другими проектами С# (csproj) в рамках одного решения?
Сценарий
Я экспериментирую с Visual Studio 2015 RC, особенно глядя на переход на новую структуру ASP.NET 5, структуру проекта и новый DNX, который запускает приложения ASP.NET 5.
У моего работодателя есть много существующих решений, ориентированных на .NET Framework 4.5.2. В наших существующих решениях Visual Studio у нас могут быть следующие проекты:
[Solution] Sample.sln
[Folder] src
[Project] ClassLibrary.csproj
[Project] WindowsService.csproj
[Project] WebApplication.csproj
[Folder] test
[Project] ClassLibrary.UnitTests.csproj
...
В этом случае ClassLibrary.csproj
- это библиотека классов С#, содержащая общий код. Это зависимость /, на которую ссылаются как WindowsService.csproj
, так и WebApplication.csproj
.
Мы специально не пытаемся настроить .NET Core, dnxcore50
. На этом этапе мы счастливы ориентироваться на .NET Framework, dnx451
. Однако мы абсолютно пытаемся использовать новые возможности ASP.NET 5 и соответствующую структуру проекта.
Ниже приведены некоторые параметры, о которых я думал, но у обоих есть проблемы.
Вариант 1
Когда мы заменим проект WebApplication.csproj
выше новым проектом ASP.NET 5 DNX WebApplication-dnx
, мы можем по-прежнему ссылаться на ClassLibrary.csproj
как из этого нового проекта DNX, так и из существующего проекта WindowsService.csproj
. Однако возникают некоторые проблемы:
-
Этот подход означает, что любые изменения кода в ClassLibrary.csproj
требуют, чтобы перестройка была видимой в запуске WebApplication-dnx
. Это не удивительно, но мы не получаем полной выгоды от компиляции с источника для WebApplication-dnx
.
-
Мы не можем легко нацелить другие фреймворки, например. dnxcore50
. Как и выше, на данном этапе это не является конкретной целью.
Вариант 2
Если мы заменим ClassLibrary.csproj
на проект библиотеки классов DNX ^ ClassLibrary-dnx
, то проблемы в опции 1 не применяются. Казалось бы, этот подход будет более соответствовать тому, как будет выполняться среда выполнения .NET и связанные с ней технологии, такие как ASP.NET, в будущем.
Однако я не могу найти способ ссылки ClassLibrary-dnx
на WindowsService.csproj
. Если этот подход жизнеспособен, я полагаю, что решение имеет какое-то отношение к опции уровня проекта для Produce outputs on build
, а затем ссылается на .nupkg
или, возможно, даже на .dll
, который создается во время сборки. Однако я не вижу чистого способа достижения этого с помощью инструмента.
^ Проекты библиотеки классов DNX называются Class Library (Package)
в VS 2015 RC. Этот тип проекта ранее назывался ASP.NET Class Library
в CTP.
Резюме
Основываясь на приведенной выше информации, я ищу:
-
Некоторые отзывы о моих сценариях и проблемах.
-
Предложения по другим параметрам, о которых я не думал.
-
Возможно, указывается, какой подход следует использовать для продвижения вперед.
Ответы
Ответ 1
Посмотрите, что делает EntityFramework.
Они нацелены на 3 TFM: net45,.NETPortable, Version = v4.5, Profile = Profile7, frameworkAssemblies, и они имеют как csproj, так и xproj в той же папке.
В принципе, для каждого проекта у вас есть два файла проекта.
Однако я не могу найти способ ссылки на ClassLibrary-dnx из WindowsService.csproj.
К сожалению, это пока невозможно. Вы можете ссылаться только на csproj из xproj, а не наоборот. У вас есть две альтернативы: (1) имеют как xproj, так и csproj, подобные EF, или (2) ссылаются на пакет NuGet из csproj.
Если вы хотите сделать альтернативу (2), вы можете установить выход xproj в папку и добавить это как канал NuGet.