Подтвердить что ты не робот

Гарантировать ту же версию пакетов nuget

У нас есть структура, которая разбита на множество отдельных проектов в одном решении. Теперь я хочу создавать пакеты NuGet для каждого отдельного проекта, но гарантирую, что только одна версия фреймворка может использоваться в одном решении (возможно, в нескольких проектах).

Например, скажем, что структура состоит из двух проектов:

Framework
   Framework_1
   Framework_2

Теперь при использовании этой структуры один проект может ссылаться на Framework_1, а другой проект ссылается на Framework_2. Я хочу убедиться, что оба пакета имеют одну и ту же версию (бонусные баллы, если есть простой одноэтапный процесс для перехода на более новую версию)

Я думал, что просто определю один пакет Framework уровня решения, который все остальные пакеты будут строго зависеть. Проблема в том, что у NuGet нет проблем, просто устанавливая несколько версий пакета уровня решения.

В основном я пробовал следующее:

Файл nuspec уровня решения:

<?xml version="1.0"?>
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
  <metadata>
    <id>My.Framework</id>
    <version>1.0.0</version>
    <title>My.Framework</title>
    <authors>voo</authors>
    <owners>voo</owners>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>Some Framework Solution Package</description>
    <copyright>Copyright ©  2015</copyright>
  </metadata>
</package>

И один пакет nuspec для одной части:

<?xml version="1.0"?>
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
  <metadata>
    <id>My.Framework.BL</id>
    <version>1.0.0</version>
    <title>My.Framework.BL</title>
    <authors>voo</authors>
    <owners>voo</owners>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>Business Layer</description>
    <copyright>Copyright ©  2015</copyright>
    <dependencies> 
        <dependency id="My.Framework" version="[1.0.0]"/>
    </dependencies>
  </metadata>
</package>

Проблема в том, что если я попытался установить, скажем, еще один My.Framework.EF пакет с версией 1.0.1, а явная зависимость от My.Framework 1.0.1 Visual Studio будет просто устанавливать My.Framework дважды - один раз с версией 1.0.0 и один раз с 1.0.1.

4b9b3361

Ответ 1

Оказывается, вы можете вызвать Install-Package $package.Id -version <someVersion> внутри Install.ps1, который затем приведет к удалению изначально установленной версии и установленной версии.

Несколько упрощенная версия выглядит следующим образом:

param($installPath, $toolsPath, $package, $project)

function GetInstallingVersion() {
    $package.Version
}

# Gets the current version of the used framework. 
# If no framework is yet installed, we set the framework version 
# to the one that being installed right now.
function GetCurrentFrameworkVersion() {
    $solutionPath = Split-Path $dte.Solution.FileName
    $fwkVersionFile = "${solutionPath}\framework_version.txt"
    if (Test-Path $fwkVersionFile) {
        return Get-Content $fwkVersionFile
    } 
    else {
        $installingVersion = GetInstallingVersion
        $installingVersion > $fwkVersionFile
        return $installingVersion
    }
}

$currentFwkVersion = GetCurrentFrameworkVersion
$installingVersion = GetInstallingVersion

if ($currentFwkVersion -ne $installingVersion) {
    Install-Package $package.Id -version $currentFwkVersion
}

Ответ 2

вы можете ограничить версию своего пакета, используя следующий синтаксис в вашем файле packages.config:

<package id="jQuery" version="1.9.1" allowedVersions="[1.9.1]" />

Также из оригинальной документации nuget: Когда вы создаете пакет NuGet, вы можете указать зависимости для пакета в файле .nuspec.

<dependency id="ExamplePackage" version="[1,3)" />

В этом примере допустимы версии 1 и версии 2.9, но не 0,9 или 3,0.

Я предполагаю, что вы можете ограничить его таким образом до одного или нескольких диапазонов версий. Здесь вы можете узнать больше об этом.

Ответ 3

Я бы вырвал "пакет NuGet решения уровня решения" и разделил вашу структуру на компоненты и создавал пакет NuGet для каждого компонента. Никто не будет иметь один единственный проект, который ссылается на пакет NuGet "Framework Wrapper", а также код для бизнес-логики, доступа к данным и WCF внутри этого единого проекта.

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

Например, скажем, что My.Framework.BL имеет зависимость от My.Framework.DAL. Итак, на данный момент у вас есть только 2 файла Nuspec и 2 пакета NuGet, с .nuspec вашего My.Framework.BL выглядит так:

<dependencies>
  <dependency id="My.Framework.DAL" version="1.0.0" />
</dependencies>

И с вашим My.Framework.DAL, не содержащим зависимых от My.Framework зависимостей.

Это хорошо, и ваше решение о том, чтобы сильно связать число, связанное с версией, проблематично по нескольким причинам. Первым и самым важным является то, что он смутит ваших пользователей инфраструктуры, если вы обновите My.Framework.DAL, если у него есть 0 изменений, но вам пришлось обновить его, потому что вы изменили My.Framework.BL.

Вы могли бы пройти месяц или, возможно, и не должны обновлять зависимость My.Framework, в зависимости от уровня абстракции вашей структуры и от того, какую степень низкоуровневого программирования вы делаете. На мой взгляд, необходимость обновлять версии dll Core Framework при отсутствии каких-либо новых изменений - это БОЛЬШАЯ БОЛЬШАЯ проблема, чем номера версий всех DLL My.Framework. Приветствия.:)

Здесь - ссылки duspec ссылок.