如何忽略缓存以覆盖存储库中的nuget包?

如何忽略缓存以覆盖存储库中的nuget包?,nuget,Nuget,这是我使用NuGet.Client API下载NuGet包的方法 public DownloadResourceResult DownloadPackage(string packageId, NuGetVersion version) { var packageSource = new PackageSource(_Task.PackageSource); var sourceRepository = new SourceRepository(p

这是我使用NuGet.Client API下载NuGet包的方法

    public DownloadResourceResult DownloadPackage(string packageId, NuGetVersion version)
    {
        var packageSource = new PackageSource(_Task.PackageSource);
        var sourceRepository = new SourceRepository(packageSource, Repository.Provider.GetCoreV3());
        DownloadResource downloadResource = _DownloadResource ?? (_DownloadResource = sourceRepository.GetResourceAsync<DownloadResource>().Result);
        var packageIdentity = new PackageIdentity(packageId, version);
        var packageDownloadContext = new PackageDownloadContext(NullSourceCacheContext.Instance);
        string globalPackagesFolder = SettingsUtility.GetGlobalPackagesFolder(_Settings);
        return downloadResource.GetDownloadResourceResultAsync(packageIdentity, packageDownloadContext, globalPackagesFolder, _Logger, CancellationToken.None).Result;
    }
总的来说,它做了它应该做的事情。有一件事我不明白。有没有办法告诉GetDownloadResourceResultAsync方法忽略当前缓存并再次下载和解包包

例如,我在NuGet存储库中有一个名为MyPackage的NuGet包。之后我调用这个方法来下载包。MyPackage已下载并解压缩到C:\Users[CurrentUser].nuget\packages中。如果我在存储库中更新MyPackage,然后再次调用DownloadPackage,它将不会更新缓存,整个系统将认为该包没有更新。在下载之前,我可以从C:\Users[CurrentUser].nuget\packages手动删除该包,但它似乎是入侵性的。我想应该有更好的缓存控制方法


我理解通常情况下这可能不是必需的,因为每次您需要更改软件包中的某些内容时,都会更改软件包版本,但如果您需要在不更新版本的情况下重新部署和重新测试某些内容,则自动打包和部署是必需的。

我相信这是一个示例。NuGet是为不可变的包而设计的,因此,如果您使用不同的内容重新创建相同的包版本,即使是为了测试,也会违反设计。你只是对自动打包和部署做了一个简单的评论,但没有解释为什么你要编写自定义代码来下载包,而不是使用nuget.exe,所以我很难给出一个好的建议

如果您有一个自动创建包的CI/CD环境,并且其他测试自动使用它们,那么我建议使用预发布版本号构建包,并将其发布到dev-nuget提要。例如,您可以看到ASP.NET团队的CI服务器在哪里发布包的开发版本,每天发布多个。当他们准备发布生产就绪版本时,另一个CI构建包将不包含预发布版本,并推送到nuget.org,而不是他们的dev提要

这取决于你想做什么,可能对你有用。假设您使用git进行源代码控制,如果您将测试的全局包文件夹放在git repo中被忽略的部分,那么git clean-Xdf将删除它,我相信CI服务器在构建之前进行清理是很常见的。这也是我为本地手动测试所做的,我不想污染我的全局缓存。我只需在完成后删除文件夹

最终,包缓存只是一个文件夹,您可以使用System.IO API删除它,而无需使用NuGet API。尽管如此,如果您想说明nuget.config文件可以更改global packages文件夹这一事实,您可能需要使用nuget API来查找它。如果您不介意删除所有包,您可以只运行nuget.exe locals global cache-clear并避免编写任何代码