Как стать автором
Обновить

Комментарии 18

Постоянно пользуюсь этим продуктом и есть даже внутренний репозиторий. Для меня есть существенный недостаток, который немного напрягает - это автоматическое инкрементирование версий пакетов в соответствии с версиями сборок. Нет ли информации как можно автоматизировать сборку пакета в соответствии с версией сборки?

пользуюсь этим продуктом

Простите, а этим - это каким? В смысле, как именно собираете пакет? Насколько я понял, версия берётся из .nuspec, а туда при желании можно вписать вообще что угодно.

Играл давеча с созданием нугетов и заливкой в GitHub Packages, вот пример минималистичного воркфлоу, версия подставляется из конфига, при этом там можно написать что угодно:

Simple GitHub action to build NuGet package

или альтернативный вариант, в котором пакет собирается по пушу тега, а версия берётся из названия этого тега (но это оказалось менее удобно)

Simple GitHub action to build NuGet package on tags push

Речь про nuget, конечно. Я имею в виду возможность задавать версию при локальной сборке по событию после успешного завершения сборки проекта. У меня происходит автоматический инкремент версии сборки в Visual Studio. Хочу видеть автоматический update номера версии в новом пакете nuget. Т.е.:

  1. Изменения в проекте

  2. Запуск сборки с автоматическим изменением версии

  3. Создание локального пакета Nuget с обновлением версии пакета в п.2

Нужен п.3

Добавить в проект кастомный таргет с запуском команды пересборки пакета? В .csproj (в предположении, что версия доступна через пропертю)

...
  <Target Name="BuildNugetPackage" AfterTargets="Build">
    <Exec Command="nuget pack .\package.nuspec -Version $(PackageVersion)" />
  </Target>
...

Прям мистика какая-то:

В справке самого пакета nuget нет параметра -Version. Однако он показывает его только если попросить справку по команде "pack":

Вы себе не предствляете, сколько я перечитал в своё время документации по поиску этой информации! И только как я увидел ваш пример, так это и помогло решить мою проблему! Только у меня в проекте на $(PackageVersion) , а@(VersionNumber) и использую я его в Build Events\Post build

Спасибо! Заработало.

Я в итоге для себя решил проблему с версионированием с помощью Conventional Commits спецификации. Сделал пакет, который автоматически присваивает версии, основываясь на feat:/fix:/BREAKING CHANGE префиксах к коммитам и вашей истории в git. Работает в том числе локально.
Вот здесь можно подсмотреть target, который переопределяет версию пакета во время сборки, его можно переписать на ваши условия:
https://github.com/HavenDV/ConventionalCommitsGitInfo/blob/main/src/libs/ConventionalCommitsGitInfo/build/ConventionalCommitsGitInfo.targets

НЛО прилетело и опубликовало эту надпись здесь
Хотя по сравнению с nodejs и гошниками, ситуация с c# ещё детский лепет. Там вообще оторопь берёт.

Пожалуйста, про гошников поконкретнее.
НЛО прилетело и опубликовало эту надпись здесь
Вот, например, зависимости более-менее большого приложения — github.com/mattermost/mattermost-server/blob/master/go.mod
Не знаю, есть ли аналог такого приложения на C# (чтобы сравнить кол-во), но если пробежаться по зависимостям, то наверно что-то и окажется в стандарном .Net, но скорее всего в разы количество внешних пакетов не сократится.

В Go все пакеты распространяются в виде исходников — нет такой проблемы, что в репозитории один код, а в nuget/npm выложено что-то другое. Это же упрощает навигацию по внешним исходникам, их отладку и модификацию. Можно стандартным тулингом все внешние пакеты завендорить (все внешние исходники будут в папке vendor), провести их полный аудит, а затем при обновлении зависимостей проверять уже только диффы в папке vendor.

Для го это нормально, когда зависимости тянут 5 разных версий одного пакета?

github.com/blevesearch/zapx/v11 v11.3.4 // indirect                             

github.com/blevesearch/zapx/v12 v12.3.4 // indirect                             

github.com/blevesearch/zapx/v13 v13.3.4 // indirect                             

github.com/blevesearch/zapx/v14 v14.3.4 // indirect                             

github.com/blevesearch/zapx/v15v15.3.4// indirect

https://github.com/mattermost/mattermost-server/blob/b45ff0be5d61e0f5be402f1fbad6ea3de837f92a/go.mod#L95

Нормально. Есть соглашение, что при нарушении обратной совместимости мажорная версия пакета должна быть увеличена. Мажорные версии присутствуют в полном имени пакета как последний элемент (за исключением версий 0 и 1) — с т.з. тулинга это просто разные пакеты т.к. имена разные. Подробнее и точнее — go.dev/doc/modules/version-numbers

Моя мечта сделать нечто похожее на nuget, но для исходников

Теоретически в нугеты можно класть что угодно, и сорцы в том числе. Например, https://stackoverflow.com/a/52885223/7468485

при желании не всё, а только нужное

Теоретически в нугет можно положить хитро настроенный .targets с блекджеком пропертями и кондишионами. Вот пример с условием по $(Platform) . Ну или разбить на несколько пакетов и инклюдить каждый по необходимости

НЛО прилетело и опубликовало эту надпись здесь

nuget рассчитан на пакеты покрупнее, за однострочниками в npm

А меленькие фрагменты кода - это сниппеты.

Когда то пытался сделать что-то похожее, с указаний версий и зависимостей методов в CDATA. Добавление методов происходило через авто-дополнение с помощью расширения.
https://github.com/HavenDV/OneCode
https://github.com/HavenDV/CSharpUtilities/blob/master/NetStandard20/Utilities/ResourcesUtilities.cs
Но в итоге понял, что это того не стоит. Сейчас многие из этих extensions использую в генераторах, которые добавляют его при необходимости, например: https://github.com/HavenDV/H.Resources.Generator

Если серьезно подходить, то одним пакетным менеджером даже с собственными пакетами ограничиваться недостаточно. Один пакет тащит другой, а тот следующий. По-хорошему надо SBOM генерировать, а на выявленные компоненты анализатор уязвимостей, а потом смотреть, что с тем ужасом, который получится делать.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий