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

时间:2016-12-21 23:14:51

标签: node.js npm

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

为什么首先阅读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.jsonpreinstall脚本中的postinstall。它们似乎只适用于该用例。

我尝试了什么

我正在安装的软件包package.json如下所示:

{
    "name": "testmodule",
    "version": "0.3.6",
    "description": "TODO",
    "scripts": {
        "preinstall": "npm i some-script && some-script",
    },
    "author": "TODO",
    "license": "MIT"
}

在我运行的some-script包中:

console.log( process.cwd() );
console.log( __dirname );
然后我跑了:

~/path/to/folder $ npm i testmodule

这将导致:

$ 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

现在我完全知道我无法真正访问运行npm i的根目录,因为我的脚本是由npm的子进程运行的,并且根目录完全不同。 < / p>

然后我认为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"
}

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

/path/to/folder/node_modules/.staging/testmodule-5cc9d333/node_modules

我向注册管理机构提交了an issue,但没有抱着我的希望及时赶到。此外,我的脚本需要在旧的npm安装上工作。

与此同时,我在some-script

中想出了类似的内容
let pgkPath = process.cwd().split('/node_modules/')[0];

这将返回/path/to/folder/这是正确的,但它假设没有人在名为npm i的文件夹中运行node_modules ...似乎hacky。

问题

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

1 个答案:

答案 0 :(得分:2)

我完全不了解您的用例,而是回答您从预安装脚本中找到父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"
}