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

时间:2018-10-23 03:18:48

标签: nuget

这是我使用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中手动删除该程序包,但它似乎具有侵入性。我想应该有一种更好的缓存控制方法。

我通常理解是没有必要的,因为每次您需要更改软件包中的某些内容时,都需要更改软件包的版本,但是对于自动打包和部署则是必要的,以防您需要重新部署和重新测试某些内容而不必更新版本。

1 个答案:

答案 0 :(得分:1)

我相信这是XY problem的示例。 NuGet专为使软件包不可变而设计,因此,即使您为了测试而重新创建具有不同内容的相同软件包版本,也要与设计背道而驰。您仅对自动打包和部署发表了评论,但没有解释为什么您要编写自定义代码来下载软件包而不是使用nuget.exe,所以我很难提出一个好的建议。

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

根据您要执行的操作,changing the global packages folder可能对您有用。假设您使用git进行源代码控制,如果将测试的全局包文件夹放在git repo的被忽略部分中,那么git clean -Xdf将删除它,并且我相信CI服务器在构建之前先进行清理是很常见的。这也是我在不想污染全局缓存的本地手动测试中所做的事情。完成后,我只是删除文件夹。

最终,程序包缓存只是一个文件夹,您可以使用System.IO API删除该文件夹,而无需使用NuGet API。虽然,如果要考虑nuget.config文件可以更改全局程序包文件夹这一事实,则可能要使用NuGet API来查找它。如果您不介意删除所有软件包,则可以运行nuget.exe locals global-cache -clear并避免编写任何代码。