如何配置 package.json 以先安装本地包,然后尝试从注册表或存储库安装它?



有没有办法在package.json中配置npm install进程,以首先尝试从本地源安装新软件包,如果没有,则尝试从其他地方安装它?

是的,我知道这是版本的语法,但我需要这样的东西:

"dependencies": {
"ui-elements": "file:path/to/ui-elements || git+https://user@bitbucket.org/user/ui-elements.git"
}

我需要这样的行为的原因是因为我有一个包含一些 UI 元素的包,这些元素在不同的 React 应用程序中使用。这些 UI 元素处于积极开发状态,这就是为什么我需要它的本地副本。最后,这些应用程序将部署在 AWS 云上,Docker 将尝试安装依赖项,如果此包在本地不存在,我可以在一个配置文件中从存储库安装依赖项,那就太好了。

我也知道npm link,但是在一堆目录中手动执行此命令,并且每次在新环境或本地计算机上以特定方式运行npm link会很烦人。这与可移植性无关。:)

谢谢。

我找到了一个完全适合我需求的解决方案。我决定在安装所有软件包后立即使用postinstall钩子运行自定义脚本。然后我在package.json中声明了一个自定义属性localDependencies

这就是它在package.json中的样子:

"scripts": {
"postinstall": "node install.js"
},
"localDependencies": {
"ui-elements": "file:path/to/ui-elements"
},
"dependencies": {
"ui-elements": "git+https://user@bitbucket.org/user/ui-elements.git"
}

至于文件install.js,我已经尝试了几种解决方案来完成它。首先,我尝试使用 npm 包中的npm.commands.install(dependencies)。这个install()方法工作正常,但这里的问题是,这个方法还使用package.jsonlocalDependencies的依赖项覆盖了我的依赖项列表。我试图找到一种方法--no-save参数传递给install方法,但它根本没有工作。总的来说,这个 API 没有在任何地方记录(或者我找不到它(。这就是为什么我决定使用child_process中的exec函数并直接运行npm命令。

install.js

const { exec } = require('child_process');
const packageJson = require('./package.json');
if (process.env.NODE_ENV !== 'production' && packageJson.localDependencies) {
Object.values(packageJson.localDependencies).forEach((path) => {
exec(`npm install ${path} --no-save`).stderr.pipe(process.stderr);
});
}

那么,我们到底有什么?

对于生产,我们需要export NODE_ENV='production'全局变量,之后install.js将被忽略,一切都将照常工作。

对于本地开发,我们只需要一个有效的路径localDependencies的包。从postinstallnpm install脚本后,只需从本地存储重新安装新包即可。

只有一个缺点,postinstall会重写已经存在的下载包。

相关内容

最新更新