Локально разработанный Nuget с зависимыми проектами - PullRequest
0 голосов
/ 01 мая 2019

Допустим, у меня есть проект A и проект B .Проект A зависит от проекта B .Поэтому A обычно имеет прямую ссылку на DLL B .

Затем я решил опубликовать B как пакет nuget.Теперь A имеет ссылку на B через nuget вместо локальной библиотеки DLL.

Недостатком этой схемы является то, что если я обновлю B , Мне нужно загрузить новый nuget и дождаться его доступности, чтобы использовать его с A .

Я вижу, что при обновлении я могу указать на локальный пакет nuget A ссылка на B , так что это немного помогает.Однако, если я внесу изменение в B , мне все равно придется пройти через этапы создания нового пакета и обновления ссылки A на пакет до A увидит изменение.С предварительной договоренностью я просто собрал B и A увидит изменения.

Альтернативой является удаление A .сослаться на пакет nuget B и вернуться к указанию на локальную DLL при выполнении локальной разработки.Однако, если A опубликовано на github, то ссылка должна быть возвращена к ссылке nuget, прежде чем отправлять ее на github.

Какова лучшая практика в подобной ситуации?Наверняка многие люди имеют дело с подобными вещами, когда широко используются github и nuget.


ОБНОВЛЕНИЕ

Эта тема возникла для обсуждения в субреддите C # и были отмечены некоторые интересные подходы.

Devure Azure - оригинальный комментарий - благодаря B0dona

Мы используем Azuredevops (https://azure.microsoft.com/en-us/services/devops/) для автоматической сборки и передачи наших пакетов nuget в наш собственный репозиторий (nuget.org работает медленно) после добавления нового коммита.

Вы настроили его один раз, нажмите на проектB выпейте немного кофе и наслаждайтесь радостью обновления пакетов.

подмодули git - оригинальный комментарий - благодаря alkrun

Вы упоминаете GitHub такЯ предложу что-то немного другое:

По моему мнению, если работа над проектом A может вызвать изменения в проекте B, ссылаться на B как на подмодуль git гораздо проще, чем работать с nuget.Подмодули Git не лишены головной боли, но для этого они и были разработаны.Некоторые из преимуществ:

1) Самое большое то, что если вы скажете: «Если мне нужно изменить B, тогда я просто внесу изменение и буду нажимать, чтобы создать новый пакет, а затем протестировать его в A»это не очень гибкая модель для работы, и она требует от разработчиков вставить непроверенный код в B. Затем этот 1-3-минутный оборот для сборки / пакета CI превращается в 3 x 1-3-минутные обороты, и это просто ужасно, когда я 'мы пробовали это в прошлом.Это огромный убийца производительности.

2) Любые другие варианты изменения файлов csproj, они могут работать, но они очень подвержены ошибкам.Разработчики не всегда замечательно рассматривают все изменения, прежде чем их зафиксировать, разработчики забудут и отметят изменение в ссылке на проект, и это вызовет сбои сборки.

3) Использование Bпоскольку подмодуль для A не мешает вам иметь автоматические сборки на B, которые производят пакеты nuget, и, возможно, другие проекты, которые с меньшей вероятностью изменят B, могут / должны ссылаться на эти

4) В какой-то моментразвитие A, если оно созревает и становится менее вероятным, чтобы вызвать изменения в B, то вы можете переключить A-> B на ссылку на пакет nuget также

Другой вариант, я помню, читал статью несколько лет назад, когда кто-тосоздал инструмент, который сгенерировал файл msbuild xproj, который заменил бы ссылки на пакеты ссылками на проекты.У них это было настроеногде файл xproj был в .gitignore, а если файл не существовал, использовалась ссылка на пакет nuget.Таким образом, разработчик запускает команду для переключения на ссылки на проекты, вносит необходимые изменения, фиксирует их, отправляет изменения, а затем обновляет ссылку на nuget.Мне это показалось довольно чистым, но я не могу найти статью, и она была немного сложнее, чем я ее озвучиваю.

Так что я все равно пошел бы по пути подмодуля git.Есть некоторые причуды с подмодулями git, но с ними стало намного легче иметь дело в последние пару лет, и кажется, что причуды легче объяснить, чем другие варианты.Воспользовавшись этим для нескольких проектов сейчас, это очень интуитивно понятно.Чтобы понять, что такое подмодуль Git в состоянии отсоединенного заголовка и как его избежать, обязательно используйте опцию -b при добавлении подмодуля и найдите хороший инструмент, который может хорошо обрабатывать подмодули.Несмотря на это, VS Code - самый интуитивно понятный интерфейс, который я нашел для работы с подмодулями.Откройте A в VS Code, затем перейдите на вкладку управления версиями, и вы увидите A и все подмодули, перечисленные вверху вместе с ветвями, которые они отслеживают.Передайте изменения в подмодуль, затем в родительский, и все готово.

Ответы [ 2 ]

2 голосов
/ 01 мая 2019

Если вы используете Visual Studio 2017, вы можете установить расширение NuGet Reference Switcher для Visual Studio 2017 .Вот руководство, как его использовать: https://github.com/RicoSuter/NuGetReferenceSwitcher/wiki/Guide

1 голос
/ 13 мая 2019

Сообщество Node демонстрирует более надежный подход. Команда npm link , доступная «из коробки» (см. Также это сообщение в блоге ), создает символическую ссылку из каталога распределенных пакетов в каталог исходного пакета. Таким образом:

  • потребители пакетов прозрачно перенаправляются в исходный проект пакета
  • изменения в источниках пакетов автоматически отражаются на стороне потребителя

Подход npm link имеет также следующие преимущества по сравнению с опорным переключением:

  • В исходный код потребителя не вносятся изменения, которые могут быть случайно зафиксированы.
  • работает кроссплатформенно, не требует специальной IDE
  • может быть написано в сценарии и передано команде

Эта функция, очевидно, требуется в сообществе NuGet, но по какой-то причине в NuGet ее по-прежнему нет. Существует запрос функции https://github.com/NuGet/Home/issues/1821,, который указывает, что они не планируют добавлять его.

Тем временем я создал инструмент, который работает аналогично npm link для пакетов NuGet, вы можете попробовать его: https://www.nuget.org/packages/NuLink

...