Возможно, я нажимаю конверт здесь, но я отчаянно пытаюсь использовать NuGet, чтобы облегчить аддон DLL, в котором я оказался.
У нас есть 4 основных продукта, которые все живут во взаимосвязанных хранилищах Mercurial. Все они "разделяют" 3 основных сборки, а затем все остальное в значительной степени зависит от продукта. Теперь стало очень сложно управлять, потому что один продукт был обновлен до .NET 4.0 и использует внешние зависимости, которые требуют .NET 4.0, а другой продукт застрял в .NET 3.5 по причинам, по которым я даже не хочу входить.
Итак, мы потеряли способность сливать различия между продуктами.
Чтобы исправить это, я хочу вытащить 3 основные сборки и превратить их в свой собственный проект с их собственным циклом выпуска и позаботиться о том, чтобы они могли компилироваться как с .NET 3.5, так и с 4.0, а затем превратите их в пакеты NuGet, содержащие несколько версий фреймворка.
НО, я также хочу, чтобы разработчики могли просматривать исходный код этих проектов.
Итак, я настроил частный сервер NuGet и закрытый сервер SymbolSource. Затем я тщательно объединил все изменения со всеми репозиториями и выбросил все, кроме моих основных сборок. Затем я тщательно отредактировал файлы .csproj вручную, чтобы вместо платформы AnyCPU каждый проект имел целевые платформы 3.5 и 4.0, которые задают условные константы (для управления особенностями платформы, такие как System.Dynamic), и устанавливает версию фреймворка.
Затем я установил конфигурации решений для "3.5 Debug", "3.5 Release", "4.0 Debug" и "4.0 Release". Каждый из них предназначен для соответствующей конфигурации (отладка или выпуск) и платформы (3.5 или 4.0).
Я могу создать все в Visual Studio для любой платформы. Теперь у меня есть проблема, когда дело доходит до NuGet, потому что есть два способа создать пакет, и у обоих есть слабость, если я не пропущу что-то:
Пакет по файлу проекта
nuget pack MyProject.csproj -Build -Symbols -Version <insert-from-build-server> -Properties "Configuration=Release;Platform=3.5;"
Проблемы с этим:
- В то время как версия 3.5 построена и упакована, на выходе написано "Построение проекта для целевой среды".NETFramework, версия = v4.0 ".
- Если я распакую результирующие пакеты, сборки находятся под
lib\net40
, что неверно. - Я не думаю, что есть какой-либо способ разместить 2 рамочных объекта таким образом, вы должны сделать это другим способом с папками и соглашениями.
- Я согласен с тем, что вы не можете скомпилировать фреймворки вместе и сделать 2 пакета под названием MyProject (которые я буду делать как 4.0) и MyProject.V35... однако я не могу понять, как иметь одинаковые проекта и nuspec и заканчиваются двумя разными результатами с разными идентификаторами.
Пакет по файлу Nuspec
С помощью этого метода я должен сам выполнить все mysbuilding, а затем выполнить кучу копирования файлов, чтобы настроить структуру папок, например
* MyProject.nuspec
* net40
* MyProject.dll
* MyProject.pdb
* net35
* MyProject.dll
* MyProject.pdb
Тогда я могу запустить nuget pack MyProject.nuspec
, но тогда нет никакого источника, чтобы идти с символами, потому что без файла .csproj у NuGet нет способа выяснить, где получить все исходные файлы, и я не вижу любая документация о том, как это сделать, используя соглашения о каталогах.
Итак, мои вопросы:
- Есть ли способ добавить исходные файлы в пакет на основе условных обозначений?
- Есть ли способ упаковать пакет на основе проекта дважды с разными идентификаторами?
- Есть ли еще один способ, который, возможно, я не рассматривал?
Любые мысли будут высоко оценены.