分发带有软件包的NPM脚本,供项目安装该软件包使用

时间:2018-09-10 12:52:50

标签: javascript npm package.json npm-scripts

我已经将所有我的Linting配置和相关的软件包/插件/预设(用于更漂亮,stylelint,eslint,commitlint)移到了npm软件包中。然后,我在多个项目中使用该软件包,并将配置扩展或合并到项目的本地配置文件中,以确保一致性并消除安装和保持开发依​​赖项最新状态的需要。

在配置旁边,我有许多有用的npm脚本,它们运行linters并执行各种其他与开发相关的功能,例如:

"lint:prettier": "prettier 'src/**/*.{js,json}' --write",
"lint:eslint": "eslint 'src/**/*.js'",
"lint:compatibilityCheck": "eslint --print-config .eslintrc.js | eslint-config-prettier-check",
"lint": "npm run lint:compatibilityCheck && npm run lint:prettier && npm run lint:eslint"

这些脚本当前在我的所有项目中重复,但是我想将这些脚本与共享包一起分发,以便在一个位置定义它们。我该怎么办?

4 个答案:

答案 0 :(得分:2)

npm blogn开始,似乎没有“直接方法”在npm软件包中公开开发脚本。博客文章建议使用shelljs模块创建运行首选脚本的JavaScript文件。

示例:假设您要公开lint:prettier": "prettier 'src/**/*.{js,json}' --write"

将通话包装在bin / lintprettier.js中:

#! /usr/bin/env node
var shell = require("shelljs");
const path = require("path")

process.env.PATH += (path.delimiter + path.join(process.cwd(), 'node_modules', '.bin'));
shell.exec("prettier 'src/**/*.{js,json}' --write");

然后将其添加到package.json中导出的控制台脚本中:

...
"bin": {
   "lint-prettier": "bin/lintprettier.js"
}
...

最后,您可以在项目中重复使用脚本:

"scripts": {
   "build": "...",
   "lint:prettier": "lint-prettier"
 }

答案 1 :(得分:0)

我不确定尝试并允许依赖项更改依赖配置是否正确,即使我知道简单的方法也可以。

相反,不要尝试从底部到顶部。我极力建议使用lerna

这是一个用于在monorepo中管理软件包的好工具,您甚至可以提升软件包之间的共享依赖关系,而且对于您的问题,它允许在所有软件包的顶部定义一个主package.json一次定义npm script,然后使用一个命令为所有软件包(或使用scope功能的其中几个软件包)运行它。

答案 2 :(得分:0)

一种方法是使用Builder

Builder允许您将npm脚本作为NPM软件包发布,并在安装了包含脚本的软件包的任何项目中运行它们。

在用例中,我将所有build / test / lint脚本放入NPM软件包中,然后在所有其他项目中安装了该软件包。然后,在每个项目中,我都可以运行完全相同的命令。

Builder近期没有得到高度维护,但是它相当稳定,并且我已经成功地使用了它。自述文件非常详尽,几乎描述了您需要了解的所有内容。

克里斯蒂亚诺的答案也很好,因为采用这种方法可能会让您更好地控制解决方案的实现,而对于Builder,这是另一个具有自己的实现(且几乎没有问题)的项目。

答案 3 :(得分:0)

我制作了解决此类问题的工具。我称之为Dictator Builder。它有助于创建独立于其NPM软件包的独裁者。

可以将独裁者配置为指定scripts中的package.json,并提供所需的其他任何配置文件:

{
  "message": "Setup package.json and linting",
  "actions": [
    {
      "message": "Should have lint script in package.json",
      "haveJsonPathValues": [
        {
          "expression": "$.scripts.lint",
          "value": "npm run eslint"
        }
      ],
      "target": "package.json"
    },
    {
      "copyFrom": "static-files",
      "target": "."
    }
  ]
}