Как правильно динамически изменить NuGet PackageId и зависимость PackageId во время сборки? - PullRequest
0 голосов
/ 15 ноября 2018

У нас есть внутреннее соглашение, согласно которому, если CI / CD выполняет сборку ветви компонента, пакет NuGet должен быть опубликован как "PackageId-FeatureBranchName". Мы публикуем эти пакеты в специальном фиде, на который мы не ссылаемся в производственных сборках. В нашем сценарии сборки, если мы обнаружим, что мы выполняем сборку ветви функций, мы ищем любые файлы .nuspec, выводимые сборкой, и сборка заменит в файле .nuspec "" на "-FeatureBranchName" во всех файлах .nuspec в решение. Это прекрасно работает, если в решении есть только один пакет без зависимостей от других проектов.

Теперь у меня есть два проекта .NET Standard My.Assmebly.A и My.Assmebly.B, которые должны иметь свои собственные пакеты NuGet. B зависит от A. Я могу использовать тот же сценарий сборки выше, чтобы правильно установить каждый пакет. Тем не менее, я не уверен, что решение также обновить .nuspec для пакета B, чтобы также обновить его зависимость от A, чтобы иметь переименованное My.Assmebly.A-FeatureBranchName.

Есть ли простой способ написать это? Или я чувствую, что с dotnet pack я делаю это неправильно, но я не вижу способа установить идентификаторы пакетов через командную строку или другие, особенно когда речь идет о таких зависимостях. Я вижу токен $ id $, который вы можете установить и заменить. Но я не уверен, как использовать это сейчас, когда проекты .NET Standard генерируют свои собственные .nuspec во время сборки. Я также не думаю, что это будет работать с моей ситуацией зависимости.

<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd">
  <metadata>
    <id>My.Assmebly.B</id>
    <dependencies>
      <group targetFramework=".NETCoreApp2.1">
        <dependency id="My.Assmebly.A" version="1.0.0" exclude="Build,Analyzers" />
      </group>
    </dependencies>
  </metadata>
</package>

Должен выглядеть так:

<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd">
  <metadata>
    <id>My.Assmebly.B-FeatureBranchName</id>
    <dependencies>
      <group targetFramework=".NETCoreApp2.1">
        <dependency id="My.Assmebly.A-FeatureBranchName" version="1.0.0" exclude="Build,Analyzers" />
      </group>
    </dependencies>
  </metadata>
</package>

1 Ответ

0 голосов
/ 21 ноября 2018

Не меняйте название сборки.Правильнее всего добавить имя ветви к номеру версии с помощью параметра version-suffix.Это избавит вас от необходимости искать и редактировать любые .nuspec файлы для принудительного использования соглашения об именах.

Вы можете упаковать сборку, выполнив:

dotnet pack --version-suffix [branchname]

, заменив [branchname] направильное значение.

Ваша библиотека будет опубликована как:

name: My.Assembly.A
version: 1.0.0-FeatureBranchName

Если вы добавите version-suffix к вашей версии, это также приведет к тому, что пакеты будут перечислены как pre-release вменеджер пакетов nuget.

Вы также можете использовать version-ranges в своем списке зависимостей, чтобы всегда получать конкретную версию.См. эту ссылку для официальной документации.

Но, по сути, вы можете определить свою зависимость следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd">
  <metadata>
    <id>My.Assmebly.B</id>
    <dependencies>
      <group targetFramework=".NETCoreApp2.1">
        <dependency id="My.Assmebly.A" version="1.0.*" exclude="Build,Analyzers" />
      </group>
    </dependencies>
  </metadata>
</package>

Пакет B теперь будет зависеть от последней My.Assembly.A в вашем пакете.Если вы публикуете их вместе, они должны (теоретически) оставаться в синхронизации.

...