7

У меня есть внутренний пакет NuGet, содержащий одну dll, никаких внешних зависимостей пакета NuGet и преобразований web.config.Nuget Update-Package неправильно обновляет переадресацию связывания сборки

Тем не менее, когда я запустить Update-пакет на моих проектах (класс Lib и веб-сайт) для этого конкретного NuGet, он автоматически обновляет свой веб-сайт web.config сборки обязательных переадресовывает к старых версий System.Web.Mvc и Newtonsoft .Json. На веб-сайте web.config в настоящее время они привязаны к последней используемой версии.

Использование GUI, используя управление пакетами NuGet для решения ... Я выбираю ОБНОВЛЕНИЕ этого NuGet для применимых проектов, которые ссылаются на старую версию. Затем выберите Обновить

Вот выход из диспетчера пакетов: http://pastebin.com/3ySwTRFR

И мой web.config пошел от:

<dependentAssembly> 
    <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" /> 
    <bindingRedirect oldVersion="0.0.0.0-5.1.0.0" newVersion="5.1.0.0" /> 
    </dependentAssembly> 

    <dependentAssembly> 
    <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" /> 
    <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" /> 
    </dependentAssembly> 

To:

<dependentAssembly> 
    <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" /> 
    <bindingRedirect oldVersion="0.0.0.0-4.0.0.1" newVersion="4.0.0.1" /> 
    </dependentAssembly> 

    <dependentAssembly> 
    <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" /> 
    <bindingRedirect oldVersion="0.0.0.0-4.5.0.0" newVersion="4.5.0.0" /> 
    </dependentAssembly> 

В пакет NuGet Я обновляю имеет dll, который ссылается на Newtonsoft.Json (но явно не указан зависимость пакета NuGet)

Когда неизвестный разработчик обновляет этот пакет NuGet, он прерывает рабочую среду, ища старую версию DLL MVC или JSON.NET.

В прошлом я попытался использовать -IgnoreDependencies powershell command switch, но это, похоже, не влияет на проблему.

Любая идея о том, что может трансформировать мои web.configs (без явного преобразования) во время обновления пакета?

Редактировать: VS2015 w/NuGet 3.3.0, по-видимому, ведет себя лучше ... во время случайного обновления пакета он обнаружил, что старый BAD-привязка перенаправляет и исправляет его! enter image description here

ответ

7

Пропустить применение обязательных переадресовывает вариант сейчас в NuGet 3.3.0: Issue #1147

enter image description here

0

У меня есть лучшее решение. Потому что я совершенно безумно, когда мне приходится обновлять более 72 ссылок каждый раз, когда я обновляю свои пакеты, я разработал сценарий PowerShell, который обновляет ваш Web.Config на основе пакетов в вашем пакете.config и DLL, которые вы опубликовали в BIN каталог.

param (
    [Parameter(Mandatory=$false)] 
    [string] $webConfigPath, 
    [string] $packagesConfigPath, 
    [string] $binPath 
) 

[bool]$isWindowsFormsAssemblyLoaded = $false 
[System.Xml.Linq.XNamespace]$ns1 = "urn:schemas-microsoft-com:asm.v1" 

function ClearBindings([System.Xml.Linq.XDocument] $xml) { 

    $elements = $xml.Root.Element("runtime").Element($ns1 + "assemblyBinding").Elements() 
    $l1 = New-Object "System.Collections.Generic.List[System.Xml.Linq.XElement]" 
    $l1.AddRange($elements) 

    $l1 | ForEach-Object { $_.Remove() } 
} 
function GetPackageList([System.Xml.Linq.XDocument] $xml, [string] $binPath) { 

    $elements = $xml.Root.Elements("package") 
    $l1 = New-Object "System.Collections.Generic.List[System.Xml.Linq.XElement]" 
    $l1.AddRange($elements) 

    [System.Collections.Generic.List[string]]$packageList = New-Object "System.Collections.Generic.List[string]" 
    $l1 | ForEach-Object { $packageList.Add("$binPath\" + $_.Attribute("id").Value + ".dll") } 
    return $packageList 
} 
function ExtractPublicKey([System.Reflection.Assembly]$asm) { 
    $bytes = $asm.GetName().GetPublicKeyToken() 
    return [System.BitConverter]::ToString($bytes).Replace("-", "") 
} 
function ExtractCulterInfoName($asm) { 
    if ($asm.GetName().CultureInfo.TextInfo.CultureName -eq "") { 
     return "neutral" 
    } else { 
     return $asm.GetName().CultureInfo.TextInfo.CultureName 
    } 
} 
function CreateBindingElement([System.IO.FileInfo] $fi) { 

    [System.Reflection.Assembly]$asm = [System.Reflection.Assembly]::LoadFile($fi.FullName) 
    $publicKey = ExtractPublicKey $asm 
    $culterInfo = ExtractCulterInfoName $asm 

    $assemblyIdentity = [System.Xml.Linq.XElement]::new($ns1 + "assemblyIdentity") 
    $assemblyIdentity.Add([System.Xml.Linq.XAttribute]::new("name", $asm.GetName().Name)) 
    $assemblyIdentity.Add([System.Xml.Linq.XAttribute]::new("publicKeyToken", $publicKey)) 
    $assemblyIdentity.Add([System.Xml.Linq.XAttribute]::new("culture", $culterInfo)) 

    $bindingRedirect = [System.Xml.Linq.XElement]::new($ns1 + "bindingRedirect") 
    $bindingRedirect.Add([System.Xml.Linq.XAttribute]::new("oldVersion", "0.0.0.0-65535.65535.65535.65535")) 
    $bindingRedirect.Add([System.Xml.Linq.XAttribute]::new("newVersion", $asm.GetName().Version<#$fi.VersionInfo.FileVersion#>)) 

    return [System.Xml.Linq.XElement]::new($ns1 + "dependentAssembly", $assemblyIdentity, $bindingRedirect) 
} 
function UpdateBindings([string] $webConfigPath, [string] $packageConfigPath, [string] $binPath) { 

    $webConfig = [System.Xml.Linq.XDocument]::Load($webConfigPath) 
    ClearBindings $webConfig 

    [System.Xml.Linq.XDocument] $packageConfig = [System.Xml.Linq.XDocument]::Load($packageConfigPath) 
    $packages = GetPackageList $packageConfig $binPath 

    [System.Xml.Linq.XElement]$assemblyBinding = $webConfig.Root.Element("runtime").Element($ns1 + "assemblyBinding") 

    $packages | ForEach-Object { 

     [System.IO.FileInfo]$fi = [System.IO.FileInfo]::new($_) 
     if ($fi.Exists) { 
      $newElement = CreateBindingElement $fi 
      $assemblyBinding.Add($newElement) 
     } 
    } 

    $webConfig.Save($webConfigPath) 
} 
function LoadWindowsFormsAssembly() { 
    if (!$isWindowsFormsAssemblyLoaded) { 
     [void][System.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms') 
     $isWindowsFormsAssemblyLoaded = $true 
    } 
} 
function PromptForFile ([string]$title, [string]$filter) { 

    LoadWindowsFormsAssembly 
    [System.Windows.Forms.OpenFileDialog]$dialog = New-Object System.Windows.Forms.OpenFileDialog 
    $dialog.Multiselect = $false 
    $dialog.Title = $title 
    $dialog.Filter = $filter 

    if ($dialog.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK) { return $dialog.FileName } 
    else { return $null } 
} 
function PromptForDirectory ([string]$title) { 

    LoadWindowsFormsAssembly 
    [System.Windows.Forms.FolderBrowserDialog]$dialog = New-Object System.Windows.Forms.FolderBrowserDialog 

    if ($dialog.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK) { return $dialog.SelectedPath } 
    else { return $null } 
} 
function MessageBox([string]$title) { 

    LoadWindowsFormsAssembly 
    [System.Windows.Forms.MessageBox]::Show($title) 
} 

if ([System.String]::IsNullOrEmpty($webConfigPath)) { 
    $webConfigPath = PromptForFile 'Please select the web.config file' '.NET Configuration File (web.config)|web.config' 
    if ([System.String]::IsNullOrEmpty($webConfigPath)) {exit} 
} 

if ([System.String]::IsNullOrEmpty($packagesConfigPath)) { 
    $packagesConfigPath = PromptForFile 'Please select the packages.config file' 'NuGet Package File (packages.config)|packages.config' 
    if ([System.String]::IsNullOrEmpty($packagesConfigPath)) {exit} 
} 

if ([System.String]::IsNullOrEmpty($binPath)) { 
    $binPath = PromptForDirectory "Please select your application's BIN directory" 
    if ([System.String]::IsNullOrEmpty($binPath)) {exit} 
} 


UpdateBindings $webConfigPath $packagesConfigPath $binPath 
+0

BTW, команда консоли консоли Add-BindingRedicrect не работает. Он обновляет только 3 из 72 ссылочных пакетов. Предоставленный мной сценарий проходит через все из них и действует на любых pacakges в файле package.config, если DLL не существует в каталоге BIN. – RashadRivera

Смежные вопросы