如何在 Visual Studio 中禁用对 Nuget 包的相对 URL 引用?
How do I disable relative URL references to Nuget Packages in Visual Studio?
我有一个需要 Nuget 包的代码库。我还有一个应用程序需要引用相同的 Nuget 包。
如果我单独打开任一项目并使用 Nuget Pacakge 管理器将 Nuget 包添加到 Visual Studio 中的项目,则将其添加到 [PackageName]\Packages。这正是我所期望的。
但是,如果我同时在 visual Studio 中打开两个项目,VS 会立即假设我想要 "solution" 这很好,这基本上是 VS 的组织工作,但现在添加包的方式发生了变化第一个包仍然添加到 [ProjectName]\Packages 但是当我从第二个项目引用它时,我得到一个引用路径 ..[FirstProjectName]\Packages.
如果我碰巧将 Nuget 包添加到第二个项目,然后在几分钟或几个月后将相同的 Nuget 包添加到第一个项目,那么我现在得到了相反的相同参考混乱。快进几个月,项目结构相互依赖是一个参考 url 的蜘蛛网。具有特定的文件结构依赖性。移动一个项目,删除它或者只是不获取本地副本,因为你没有使用它,整个事情变得很糟糕!
无论我打开 1 个项目还是打开 2 个项目,如何禁用此功能并使添加包的功能相同。在这两种情况下,我都希望包安装在 [ProjectName]\Packages 中,而不是第一次安装并参考第二个。
注意:添加一个 "solution wide" 公共 nuget 包目录正是我不想要的。每个项目都需要独立。能够编译和 运行 不依赖于项目目录之外的结构和功能依赖性,由项目明确引用,用于开发。
使用 Visual Studio 工具时,NuGet 不支持项目特定的包目录。
NuGet 的包目录由项目在 Visual Studio 中打开的当前解决方案定义。
packages 目录要么是隐含的 $(SolutionDir)\packages 目录,要么是由它根据当前解决方案的目录找到的 NuGet.Config 文件定义的自定义路径。 NuGet.Config 文件是通过查找多个目录找到的,但它仍然由当前解决方案的位置驱动。
借助 NuGet 3 和 project.json 文件的引入,您现在可以拥有引用而无需将它们添加到项目文件中,因此您不会遇到程序集相对路径的问题。然而,并非所有项目都支持新 project.json。此外,您使用的 Visual Studio 2013 不支持 NuGet 3。
所以你唯一的解决方法是:
- 对所有解决方案使用通用的包目录。
- 确保所有解决方案都在相对于项目文件的公共目录中。
- 编写一些实用程序,自动警告不正确的引用路径,或自动修复它们。
- 修改 NuGet,使其支持您的操作。
我能够通过将存储库路径设置为与我的项目不同的驱动器或将存储库路径设置为 UNC 路径来解决此问题。
我通过编辑我的 Nuget.Config 文件(通常在这里找到 %APPDATA%\NuGet\NuGet.Config)并添加存储库路径设置来做到这一点。
注意,代码相关文件我用的是D盘
<config>
<add key="repositorypath" value="\localhost\d$\NuGet\packages" />
</config>
我有一个需要 Nuget 包的代码库。我还有一个应用程序需要引用相同的 Nuget 包。
如果我单独打开任一项目并使用 Nuget Pacakge 管理器将 Nuget 包添加到 Visual Studio 中的项目,则将其添加到 [PackageName]\Packages。这正是我所期望的。
但是,如果我同时在 visual Studio 中打开两个项目,VS 会立即假设我想要 "solution" 这很好,这基本上是 VS 的组织工作,但现在添加包的方式发生了变化第一个包仍然添加到 [ProjectName]\Packages 但是当我从第二个项目引用它时,我得到一个引用路径 ..[FirstProjectName]\Packages.
如果我碰巧将 Nuget 包添加到第二个项目,然后在几分钟或几个月后将相同的 Nuget 包添加到第一个项目,那么我现在得到了相反的相同参考混乱。快进几个月,项目结构相互依赖是一个参考 url 的蜘蛛网。具有特定的文件结构依赖性。移动一个项目,删除它或者只是不获取本地副本,因为你没有使用它,整个事情变得很糟糕!
无论我打开 1 个项目还是打开 2 个项目,如何禁用此功能并使添加包的功能相同。在这两种情况下,我都希望包安装在 [ProjectName]\Packages 中,而不是第一次安装并参考第二个。
注意:添加一个 "solution wide" 公共 nuget 包目录正是我不想要的。每个项目都需要独立。能够编译和 运行 不依赖于项目目录之外的结构和功能依赖性,由项目明确引用,用于开发。
使用 Visual Studio 工具时,NuGet 不支持项目特定的包目录。
NuGet 的包目录由项目在 Visual Studio 中打开的当前解决方案定义。
packages 目录要么是隐含的 $(SolutionDir)\packages 目录,要么是由它根据当前解决方案的目录找到的 NuGet.Config 文件定义的自定义路径。 NuGet.Config 文件是通过查找多个目录找到的,但它仍然由当前解决方案的位置驱动。
借助 NuGet 3 和 project.json 文件的引入,您现在可以拥有引用而无需将它们添加到项目文件中,因此您不会遇到程序集相对路径的问题。然而,并非所有项目都支持新 project.json。此外,您使用的 Visual Studio 2013 不支持 NuGet 3。
所以你唯一的解决方法是:
- 对所有解决方案使用通用的包目录。
- 确保所有解决方案都在相对于项目文件的公共目录中。
- 编写一些实用程序,自动警告不正确的引用路径,或自动修复它们。
- 修改 NuGet,使其支持您的操作。
我能够通过将存储库路径设置为与我的项目不同的驱动器或将存储库路径设置为 UNC 路径来解决此问题。
我通过编辑我的 Nuget.Config 文件(通常在这里找到 %APPDATA%\NuGet\NuGet.Config)并添加存储库路径设置来做到这一点。
注意,代码相关文件我用的是D盘
<config>
<add key="repositorypath" value="\localhost\d$\NuGet\packages" />
</config>