从在preinstall上运行的npm脚本中查找package.json文件

Dom*_*nik 7 node.js npm

所以我需要package.json在通过npm安装新软件包之前阅读.

为什么首先阅读package.json?

我正在使用npm用于CSS组件,这些组件是单独版本化的并且可以具有相互依赖性.(没有提供javascript)

寻找一堆依赖项的版本冲突,我需要在package A需要时检测package C@1.0.0package B要求package C@2.0.0和处理它.

Npm(从版本3开始)通过在树内更深层地嵌入冲突模块来处理这些问题.您现在最终得到了同一模块的两个版本.CSS有一个全局命名空间,然后mixin(在Sasss的情况下)会相互覆盖并破坏你的CSS.

这个平面依赖问题在npm博客中得到了很好的概述:http://blog.npmjs.org/post/101775448305/npm-and-front-end-packaging

即使没有考虑我们的特定用例,我也很奇怪你没有访问package.jsonin preinstallpostinstall脚本.它们似乎只适用于该用例.

我尝试了什么

package.json正在安装的软件包看起来像这样:

{
    "name": "testmodule",
    "version": "0.3.6",
    "description": "TODO",
    "scripts": {
        "preinstall": "npm i some-script && some-script",
    },
    "author": "TODO",
    "license": "MIT"
}
Run Code Online (Sandbox Code Playgroud)

some-script我运行的那个包里面:

console.log( process.cwd() );
console.log( __dirname );
Run Code Online (Sandbox Code Playgroud)

然后我跑:

~/path/to/folder $ npm i testmodule
Run Code Online (Sandbox Code Playgroud)

这将导致:

$ npm i testmodule

> testmodule@0.3.6 preinstall /path/to/folder/node_modules/.staging/testmodule-5cc9d333
> some-script

/path/to/folder/node_modules/.staging/test-module-5cc9d333
/path/to/folder/node_modules/.staging/test-module-5cc9d333/node_modules/some-script
Run Code Online (Sandbox Code Playgroud)

现在我完全明白,我无法真正访问运行位置的根,npm i因为我的脚本是由npm的子进程运行的,并且具有完全不同的根.

然后我想npm root应该跟踪实际根对我的位置,并将其作为参数从testmodule package.json中传递给我的脚本:

{
        "name": "testmodule",
        "version": "0.3.6",
        "description": "TODO",
        "scripts": {
                "preinstall": "npm i some-script && some-script \"$(npm root)\"",
        },
        "author": "TODO",
        "license": "MIT"
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,它也默认返回到临时路径:

/path/to/folder/node_modules/.staging/testmodule-5cc9d333/node_modules
Run Code Online (Sandbox Code Playgroud)

我向注册管理机构提出了一个问题,但没有抱怨我们及时赶到.此外,我的脚本需要在旧的npm安装上工作.

与此同时,我在我的内心想出了类似的东西some-script:

let pgkPath = process.cwd().split('/node_modules/')[0];
Run Code Online (Sandbox Code Playgroud)

这将返回/path/to/folder/哪个是正确的,但它使得假设没有人npm i在一个偶然命名的文件夹内运行node_modules...似乎hacky.

如何从通过预安装运行的npm脚本中访问package.json的路径?对我而言,这似乎不是太过于无法要求的东西?

wjo*_*dan 3

我不完全理解您的用例,但要回答您package.json从预安装脚本中查找父级的具体问题:

$(cd .. && npm prefix)作为参数传递给脚本,然后加载./package.json.

npm prefix将返回包含package.json文件的最近父目录,当从该目录调用该文件时..,应返回父 npm 包的路径。

{
        "name": "testmodule",
        "version": "0.3.6",
        "description": "TODO",
        "scripts": {
            "preinstall": "npm i some-script && some-script \"$(cd .. && npm prefix)\"",
        },
        "author": "TODO",
        "license": "MIT"
}
Run Code Online (Sandbox Code Playgroud)