如何让NuGet以PowerShell包仓库格式下载依赖包?
如何让NuGet以缓存式布局组织packages文件夹,适配PowerShell模块搜索?
NuGet的packages.config和packages文件夹实用性很强:
- 默认固定版本,是PowerShell脚本依赖的唯一可信来源
- 下载的依赖仅存储在本地packages文件夹,不会污染系统全局环境
而PowerShell模块是全局安装的,一旦安装会改变系统所有使用场景的行为,所以我给同事分享PowerShell代码时,不想让他们的系统被污染。
于是我采用nuget.exe来管理PowerShell代码的依赖:在packages.config文件中引用所需模块,通过nuget install命令下载,再在PowerShell代码里按路径导入模块。这种方式实现了PowerShell环境的封装,不用再担心机器上共享PowerShell包文件夹的混乱状态。
但这种方式有个麻烦:按路径导入模块时,依赖的依赖无法正常工作。
我想到一个解决思路:临时把NuGet的Packages文件夹加入模块搜索路径!这方案几乎可行,但存在文件夹布局不匹配的问题:NuGet下载的包是PackageName.VersionNumber格式的文件夹,而PowerShell模块搜索要求的是PackageName/VersionNumber的层级结构。NuGet内部缓存采用的就是后者格式,但本地的packages文件夹却不是。
有没有办法解决这个问题?能不能让NuGet以缓存式布局而非常规包布局来组织本地的packages文件夹?如果可以的话,只需要三行代码就能完成依赖管理与模块导入:
& nuget restore $PSScriptRoot/packages.config $Env:PsModulePath += ";$PSScriptRoot/packages" Import-Module FooModule Import-Module BarModule
内容的提问来源于stack exchange,提问作者Pxtl
相关产品推荐
相关产品推荐

