今天我在安装软件包时遇到了NuGet的奇怪行为.
简要说明:作为我的构建脚本的结果,有一个NuGet包.我不会每次都更改版本,因此每个版本都会生成MyPackage.1.0.0.nupkg.作为构建的最后一步,我将包推送到本地网络内部署的NuGet服务器.
现在,在另一台机器上,我运行nuget install MyPackage -Source http://myserver/nuget,显然安装了NuGet包.
当我推送另一个更新MyPackage- 仍然是版本时,问题开始发挥作用1.0.0.当我尝试在客户端计算机上重新安装它时,我得到了以前版本的软件包.
我发现它是被指责的本地缓存:如果软件包已安装,它将进入本地缓存,下次安装相同版本的软件包时,它将从缓存中获取.很公平!
但是,另一方面,有一个命令-NoCache选项nuget install,我希望它忽略本地缓存.
但是,事实并非如此.我第一次运行它时-NoCache,它会更新缓存并安装真正的最新版本.但是,下次仍然从缓存中获取包,即使有-NoCache选项.
这是预期的吗?是因为版本没有改变?
以防万一:所有NuGet操作都是通过NuGet.exePowerShell会话完成的.
更新:我观察到奇怪的行为我只能通过缓存过期来解释.缓存包时,所有后续调用都会nuget install从缓存中提取包,直到一段时间过去.我没注意到确切的时间段,但肯定超过一个小时.在此之后,nuget install更新缓存中的包,情况变得相同......
这是我的nuspec文件,用于获取teamcity生成的包.该版本由teamcity变量实际设置.
<?xml version="1.0"?>
<package >
<metadata>
<id>Company.Name</id>
<version>$version$</version>
<title>Title</title>
<authors>My Name</authors>
<owners>We are the owners</owners>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>Support</description>
<releaseNotes>Summary of changes made in this release of the package.</releaseNotes>
<copyright>Copyright 2013</copyright>
<tags>Core</tags>
<dependencies>
<dependency id="Core.Assembly" version="[1.0.$teamcity.build.id$]" />
</dependencies>
</metadata>
</package>
Run Code Online (Sandbox Code Playgroud)
如何用当前的teamcity构建ID号替换版本?既尝试$teamcity.build.id$ 和%teamcity.build.id%
这没用.我也尝试过$version$.版本在包的版本标记中正确替换,但不在依赖项上.
我想使用当前版本中相同版本的软件包,因此它们具有相同的内部版本号.
更新到Visual Studio 2012 Update 3(我之前运行的是Update 2)后,NuGet无法加载.我的意思是,在我加载了一个使用NuGet并且曾经工作的解决方案后,包管理器不再出现.*它不会显示在"工具"菜单下.*右键单击解决方案后,NuGet(管理NuGet包)不显示在菜单中*右键单击项目后,NuGet(管理NuGet包)未显示在菜单中
"扩展和更新"对话框(TOOLS/Extensions和Updates ...)确实将NuGet软件包管理器显示为已安装,当我单击它时,它显示可以卸载它.
此外,当我在卸载然后重新安装NuGet软件包管理器(从我在CodePlex nuget站点上的下载)中检查安装日志后,它显示它已成功安装:
/10/2013 11:39:05 AM - Beginning to install extension to Microsoft Visual Studio Professional 2012...
7/10/2013 11:39:05 AM - Install to Microsoft Visual Studio Professional 2012 completed successfully. The extension has been installed to C:\PROGRAM FILES (X86)\MICROSOFT VISUAL STUDIO 11.0\\COMMON7\IDE\EXTENSIONS\VYALGTD2.XZS\
Run Code Online (Sandbox Code Playgroud)
我检查过,这个文件夹确实存在并包含NuGet dll.
当我转到TOOLS/Options ...对话框并选择Package Manager时,右侧窗格显示文本:"加载此属性页时出错".展开包管理器并选择"常规"或"包源"时,将显示相同的文本.
我已经多次卸载并重新安装了NuGet,我已经从下载的VSIX中直接安装了两个,并直接在Extensions and Updates对话框中安装,结果总是一样的.
我已经安装了旧版本的NuGet,我得到了相同的结果.我已卸载Visual Studio并重新安装它,我在版本1,更新2或更新3中得到相同的结果.
尝试加载NuGet时,Activity.log.xml文件显示以下问题:
<entry>
<record>211</record>
<time>2013/07/10 17:39:44.295</time>
<type>Information</type>
<source>Microsoft.VisualStudio.CommonIDE.ExtensibilityHosting.VsShellComponentModelHost</source>
<description>Successfully loaded component assembly from cache</description>
<path>C:\PROGRAM FILES (X86)\MICROSOFT VISUAL STUDIO 11.0\COMMON7\IDE\EXTENSIONS\VYALGTD2.XZS\NuGet.VisualStudio.dll</path> …Run Code Online (Sandbox Code Playgroud) Nuget,毫无疑问是一个非常有效的包装和分配系统.但是,在某些情况下,管理程序集文件变得很麻烦.对于Web应用程序尤其明显,其中站点中的许多(30+)个子应用程序被设置为继承引用.在我的情况下,单点继承是可取的,因为可以轻松地为所有子项目更新库.我将这些程序集可靠地存储在根目录中已成为一个问题.为了帮助管理这个,我想将GAC用于这些特定的库.
有没有办法通过nuget包脚本将这些库安装/更新到GAC?我总是可以采用传统方式,但如果可能的话,我想利用Nuget.该程序集将添加到服务器GAC,但该程序包的目的是允许开发人员轻松地将程序集安装到其本地GAC并在本地/服务器环境之间维护相同的引用.
我们有很多项目的解决方案,以及这些项目之间或多或少复杂的依赖图.现在每个项目都应该成为自己的nuget包,nuget包的依赖图应该反映项目的内容.
我有两个问题:
我正在编写一个使用Mono.Cecil库的PowerShell脚本.我如何安装软件包,以便在脚本中使用它?谢谢!
(为了记录,我在询问之前尝试了谷歌搜索,但所有出现的结果都是关于PMC和Visual Studio的结果,这与这个问题无关.)
控件工具包现在对System.Spacial,Microsoft.Data.Edm,Microsoft.Data.OData,Microsoft.WindowsAzure.ConfigurationManager和WindowsAzure.Storage有了新的依赖关系!
这真的有必要吗?我可以以某种方式绕过这种膨胀吗?
我们在构建环境中遇到了一个问题,我们希望我们的持续集成构建能够通过适当地附加版本号来下载标记为预发布的"最新且最好的"NuGet包-dev.
每当我们运行该命令时nuget restore,它都无法获取任何预发布版本.我查看了NuGet版本控制页面上的文档,但是它不方便地省略了有关如何将预发布范围添加到它应该在packages.config文件中下载的允许版本的详细信息.
目前,packages.config文件如下所示:
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Foo" version="1.0.0" targetFramework="net35" />
</packages>
Run Code Online (Sandbox Code Playgroud)
我们希望NuGet能够至少能够看到然后从以下列表中选择最新版本:
遗憾的是,没有看到预发布版本,并且恢复过程仅使用"已发布"的软件包.尝试下载仅预发布包时的典型错误消息是:
Unable to find version '1.0.0' of package 'Foo'.
Run Code Online (Sandbox Code Playgroud)
有没有什么方法可以在packages.config文件中指定包含预发布包的一系列版本?甚至是从.nuspec文件本身?
提前谢谢了.
我正在尝试安装DeveloperForce.Web.Login
我最近更新了我的nuget到版本2.8.50313.31
PM> Install-Package DeveloperForce.Web.Login
Install-Package : The current environment doesn't have a solution open.
At line:1 char:16
+ Install-Package <<<< DeveloperForce.Web.Login
+ CategoryInfo : InvalidOperation: (:) [Install-Package], InvalidOperationException
+ FullyQualifiedErrorId : NuGetNoActiveSolution,NuGet.PowerShell.Commands.InstallPackageCommand
Run Code Online (Sandbox Code Playgroud) 我已使用 扫描了易受攻击的 NuGet 包dotnet list package --vulnerable --include-transitive。我得到以下信息:
Project `MyProject` has the following vulnerable packages
[net6.0]:
Transitive Package Resolved Severity Advisory URL
> System.Net.Http 4.3.0 High https://github.com/advisories/GHSA-7jgj-8wvc-jh57
Run Code Online (Sandbox Code Playgroud)
如您所见,我正在使用 .NET 6。在检查我的 时packages.lock.json,我发现它System.Net.Http 4.3.0依赖于 .NET 6 NETStandard.Library 1.6.1。当阅读咨询 URL上发布的信息时,它说只有某些 .NET Core 1.x 和 2.x 运行时容易受到攻击。同样,我使用的是 .NET 6,因此我预计此漏洞不适用于我。
我很困惑如何处理这个问题。
如果该漏洞与我无关,我非常希望不要收到有关该漏洞的通知。恕我直言dotnet list package,应该考虑到目标框架,自动处理这个问题,但这是另一个问题。无论如何,这是作为 CI 构建的一部分完成的,因此误报很烦人。我不想因为与我无关的内容而收到警告或构建错误的垃圾邮件。
我可以安装最新版本System.Net.Http作为直接依赖项,但可能有数百个传递包,这是一个无法扩展的解决方案:我不想让数百个包保持最新,而且到目前为止因为我知道如果我的其他依赖项发生变化而导致它们过时,没有简单的方法可以自动删除这些“直接安装的传递依赖项”。我特别希望避免这一切,因为我似乎没有受到影响。
我的首选解决方案可能是去找依赖于易受攻击的软件包的软件包的作者并告诉他们进行更新,但首先,由于与上述相同的原因,这不会真正扩展(并且会延迟我获取补丁,特别是如果传递依赖项是从我身上删除的几个步骤,和/或如果其中一个步骤未主动维护),其次,此包仅由 引用NETStandard.Library,这不是您正常的 NuGet 包。
我应该如何处理这个问题(特别是这个例子,以及一般问题),以维护安全最佳实践(特别是修复漏洞)并且不会增加噩梦般的维护负担?
nuget-package ×10
nuget ×8
.net ×2
c# ×2
.net-core ×1
gac ×1
nuget-spec ×1
powershell ×1
teamcity-7.0 ×1
versioning ×1