Гарантировать ту же версию пакетов 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.
Ответы
Ответ 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 ссылок.