2016-12-02 30 views
5

我正在与微服务体系结构合作,核心代码通过nuget包共享。除了需要更新我的一个核心nuget软件包,然后更新10多个解决方案到最新的解决方案的罕见场合外,这一切都非常好。随着Visual Studio永久加载,我不想为了运行Nuget Package Manager中的Update-Package命令而进入并打开每一个。如何使用Visual Studio以外的nuget Package Manager从命令行安装/更新软件包?

我看着使用nuget.exe命令行,但安装选项只下载软件包,而不是将其安装到我的项目。我试图寻找如何在Visual Studio之外运行软件包管理器,但两年半前最接近的事情是this post说它在路线图上有一个过时的链接。我也不熟悉如何要求更新在这个网站上工作。

有没有人知道我是否错过了nuget的某些功能?如果没有人知道有任何替代方法可以更新nuget包以获得多种解决方案,而无需每次都等待可怕的Visual Studio加载时间?

+0

nuget cli怎么样? https://docs.nuget.org/ndocs/tools/nuget.exe-cli-reference对于答案太短:P – TigOldBitties

+2

执行“nuget install My.Nuget.Package”只会将它下载到我的解决方案的软件包/文件夹中。它实际上并不更新packages.json文件中的任何用法,也不更新csproj文件中的提示路径。手动更新这两个文件可能比打开visual studio更快,但它更容易出错(我知道会出错)。 –

+1

为什么有一个简单的VS快捷方式编辑VS之外的文件如此荒谬? “nuget.exe安装”,更具体地说“nuget.exe更新”让我获得最多的方式。真正唯一剩下的就是“install”命令在packages.config/*。csproj文件中添加一个条目,并使用“update”命令更新* .csproj文件中的hintpath。我可以制作一个快速脚本来执行命令并执行我想要的操作,但是我认为现在一直是一个解决的问题,并且没有找到立即解决的办法,我想我可能会要求其他任何人遇到这个问题。 –

回答

5

我写了一个快速的PowerShell脚本来解决我的问题。这里是任何其他人感兴趣的:

param(
    [Parameter(Mandatory=$true)]$package, 
    $solution = (Get-Item *.sln), 
    $nuget = "nuget.exe" 
) 

& $nuget update "$solution" -Id "$package" 

$sln = Get-Content $solution 
[regex]$regex = 'Project\("{.*?}"\) = ".*?", "(.*?\.csproj)", "{.*?}"' 
$csprojs = $sln | Select-String $regex -AllMatches | 
        % {$_.Matches} | 
        % {$_.Groups[1].Value} 

Foreach ($csproj_path in $csprojs) { 
    $csproj_path = Get-Item $csproj_path 
    Write-Host "Updating csproj: $csproj_path" 

    [xml]$csproj = Get-Content $csproj_path 
    Push-Location (Get-Item $csproj_path).Directory 
    $reference = $csproj.Project.ItemGroup.Reference | ? {$_.Include -like "$package,*"} 

    $old_include = [string]$reference.Include 
    $old_hintpath = [string]$reference.HintPath 
    $old_version = $old_include | Select-String 'Version=([\d\.]+?),' | 
            % {$_.Matches} | 
            % {$_.Groups[1].Value} 

    $all_packages = Get-ChildItem $old_hintpath.Substring(0, $old_hintpath.IndexOf($package)) 
    $new_package_dir = $all_packages | ? {$_.Name -like "$package.[0-9.]*"} | 
             ? {$_.Name -notlike "$package.$old_version"} | 
             Select -First 1 
    $new_version = $new_package_dir | Select-String "$package.([\d\.]+)" | 
            % {$_.Matches} | 
            % {$_.Groups[1].Value} 

    $dll = Get-ChildItem -Path $new_package_dir.FullName -Recurse -Include *.dll | Select -First 1 
    $reference.HintPath = [string](Get-Item $dll.FullName | Resolve-Path -Relative) 
    $reference.Include = $reference.Include.Replace("Version=$old_version","Version=$new_version") 

    Pop-Location 
    $csproj.Save($csproj_path) 
} 
+0

不错,看起来不错。 – TigOldBitties

+0

@Paul Milla谢谢你在这里分享你的解决方案。请标记您的答案,这对其他有相同问题的社区是有好处的。 –

+0

警告!这不会解决装配绑定重定向。如果您的项目具有冲突的传递依赖性,则仍需要刷新绑定重定向。 https://docs.microsoft.com/en-us/dotnet/framework/configure-apps/redirect-assembly-versions – bartonm

相关问题