故宫的package.json OS特定依赖(npm package.json OS specifi

2019-07-20 20:29发布

有没有在NPM的package.json文件来指定OS特定的相关办法?

例如,我只会想安装“DBUS”( https://npmjs.org/package/dbus如果用户运行的是Linux作为一个依赖)我模块。 我会为Mac和Windows不同的依赖性。

Answer 1:

有这样做,根据您的设置的一个可能的好方法。

故宫的package.json支持的操作系统的关键,

也optionalDependencies

  • os可以被用来指定一个模块可以安装在其上的操作系统。
  • optionalDependencies是模块依赖,如果不能安装它们,NPM跳过他们,并继续安装。

通过这种方式,你可以有你的模块为每个OS的可选的依赖,而只有其中一个作品将被载入/安装^。^

编辑:作为@Sebastien以下提到, 这种做法是很危险的 。 对于任何给定的操作系统,你的依赖至少一个是“必需的”,剩下的“可选”。 使得依赖可选的所有版本意味着,如果安装失败有正当的理由,它会自动跳过安装,你将丢失的依赖,你真正需要的。



Answer 2:

我想简单的答案是否定的。 我能想到的几个解决方法,虽然的-最简单的就是只需添加的一切,无论OS来的package.json,然后require()在运行时正确的。

如果不为你工作,你可能能够使用一个安装脚本,让你要去的结果- https://docs.npmjs.com/misc/scripts

我没有测试过这一点,但我认为这是可行的:

加入这样的事情您的package.json:

,"scripts": {
  "install": "node install_dependencies.js"
}

然后添加一个install_dependencies.js是检查操作系统,并运行相应的文件npm install ...命令。



Answer 3:

还有绑定-shyp模块:

https://www.npmjs.com/package/bindings-shyp

加载你的本机模块的.node文件助手模块

这对于Node.js的本地附加模块作者的辅助模块。 它基本上是“瑞士军刀”的要求()荷兰国际集团您的本机模块的.node文件。

整个节点的本地插件历史的长河中,插件已经结束了在各种不同的地方被编译,这取决于构建工具和使用节点的版本。 更糟糕的是,现在的GYP构建工具可以生成以释放或调试版本,每一个被内置到不同的位置。

该模块检查所有本地插件将在建的可能位置,并返回成功加载的第一个。



Answer 4:

在引用@npm_support:

https://twitter.com/npm_support/status/968195526989512705

2/2如果你想避免与依赖关系安装的问题,一条路径是为你写的需要的作为常规依赖的包装,并确保它有optionalDeps (也保证了包装检验你有一切需要的工作)。

但恕我直言,它看起来更像是一个解决方法不是解决问题的实际。

我可以理解,NPM要保持便携性,避免处理平台的细节,但它无论如何都要恕我直言做在运行时这样做是不是最优的(如果专业人愿意做优化代码大小)。

所以,今天我没有最佳的解决方案,分享,但对提案的公开讨论。

不能“条件依赖”被在NPM支持?

即来到我的脑海里第一件事就是添加一个“覆盖”节会改变(+增加,-remove,=替换)当前解析的部分。

例如:

dependencies: { "common-stuff": "*" } overrides: { "os: { linux: { dependencies: { "+best-linux-module" } } } }

和我认识的一个开发商建议的其他选项,将引进可提供关键字,然后几个模块可以提供比会被分解应满足的语义相同(一拉Debian的),但它产生类似的开销。

我要寻找一个通用的方法并不只专注于操作系统的支持也是对包装的其他口味(取决于发动机为例)。

你知道在NPM跟踪任何相关的问题? 如果不是我考虑到文件中的错误在被跟踪:

https://github.com/npm/npm/issues?q=dependencies+conditional

这个想法反馈欢迎。



文章来源: npm package.json OS specific dependency