为什么我创建的winform packages不在项目目录中

如何设置nuget的package路径为当前解决方案路径

严重性	代码	说明	项目	文件	行	禁止显示状态
错误		无法复制文件“C:\Users\user\.nuget\packages\selenium.webdriver.msedgedriver\138.0.3351.83\build\..\driver\win32\msedgedriver.exe”,原因是找不到该文件。	automaintain			
C:\Users\kamo\.nuget\packages

nuget的package路径 变成了 C:\Users\kamo.nuget\packages

修改.NET项目中引用的Packages包目录


通常情况下在.NET项目中会在解决方案同级的目录中生成一个packages包,解决方案各项目中引用的nuget包都会下载缓存到packages目录中,如下图所示 image-20240203224052486

如果项目少这样的方式是没有问题的,但如果有这样一个场景

负责的项目有上百个(每个项目都对应一个解决方案.sln),每个项目引用的nuget包都大同小异那么每个项目中都有packages包,包所占用的空间会很大。那么怎么解决这个问题呢?这就是本文解决的问题。

一、解决的问题

例如你的项目都是在 E:\Work 目录下,你想将其中的所有项目的包文件(packages)都放在 E:\Work\packages 目录下,目录结构如下:

E:\Work

| -- Soluation A

| -- Soluation B

| -- Soluation C

.....

| -- packages

二、操作步骤

  1. 关闭所有打开的项目(关闭Visual Studio)。

  2. 在 E:\Work 目录下新建一个 NuGet.Config 配置文件。

  3. 打开 NuGet.Config 文件,输入如下内容:

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <solution>
        <!-- 默认不将 packages 提交到源代码管理 -->
        <add key="disableSourceControlIntegration" value="true"/>
      </solution>
      <config>
        <!-- 指定这个目录为默认的 packages 目录 -->
        <add key="repositorypath" value=".\packages"/>
      </config>
      <packageRestore>
        <!-- 默认启用 packages 还原 -->
        <add key="enabled" value="true"/>
      </packageRestore>
    </configuration>
    
  1. 保存文件并退出。
  2. 至此新建项目时,如果项目的目录在 E:\Work 中那么nuget中引用的packages包将从此目录(E:\Work\packages)中进行引用。

三、注意事项

  1. 更改了NuGet.Config中的内容时一定要重新打开解决方案,否则更改将不会生效。

NuGet 的默认行为

NuGet 默认使用的全局包缓存位置通常是用户目录下的 .nuget\packages 文件夹,比如你提到的 C:\Users\kamo\.nuget\packages。这是 NuGet 的默认行为,旨在避免在每个项目或解决方案中重复存储相同的包,从而节省磁盘空间并提高依赖管理的效率。

如果你希望改变这个默认的包缓存位置,有几种方法可以实现:

方法 1:通过 nuget.config 配置文件设置

虽然直接修改全局包缓存位置并不直接支持,但你可以为特定的解决方案设置一个本地的包目录。创建或编辑位于解决方案根目录下的 nuget.config 文件,并添加如下配置:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <config>
        <!-- 对于使用 packages.config 的旧版项目 -->
        <add key="repositoryPath" value=".\packages" />
        
        <!-- 对于使用 PackageReference 的新版项目 -->
        <add key="globalPackagesFolder" value=".\packages" />
    </config>
</configuration>

这里的 "./packages" 是相对于你的解决方案目录的一个相对路径,你可以根据需要调整此路径。

方法 2:修改机器级别的 nuget.config

如果你想对所有项目都应用新的包缓存位置,可以尝试修改机器级别的 nuget.config 文件。该文件通常位于 %APPDATA%\NuGet\nuget.config 或者 C:\Program Files\NuGet.Config。但是请注意,这种方法会影响所有使用 NuGet 的项目,因此需谨慎操作。

方法 3:环境变量

另一种更改全局包缓存位置的方法是通过设置环境变量 NUGET_PACKAGES 来指定一个新的位置。例如,在 Windows 上可以通过系统设置添加一个名为 NUGET_PACKAGES 的用户或系统环境变量,并将其值设置为你想要的新路径,如 D:\NuGet\Packages

注意事项

  • 迁移现有包:如果更改了包缓存位置,现有的包不会自动移动到新位置。你需要手动迁移这些包或者重新还原它们。
  • 团队协作:确保团队成员了解任何关于 NuGet 包路径的变更,以避免不必要的冲突和问题。
  • 兼容性检查:在做出更改之前,请确认所选择的方法与你正在使用的工具版本兼容。

通过上述方法之一,你可以自定义 NuGet 包的存储位置。不过,对于大多数场景来说,默认的全局包缓存机制已经足够高效和方便,除非有特殊需求,否则不推荐随意更改这一设置。