标签: npm-scripts

如何在Lerna包中共享构建脚本

我有一个lerna repo,它包含以通常结构组织的多个包:

package.json
/packages
  - alpha
    package.json
  - bravo
    package.json
  - charlie
    package.json
Run Code Online (Sandbox Code Playgroud)

我需要转换所有包,我目前在每个包中都有以下脚本package.json:

"build": "npm run build:noWatch -- --watch --verbose",
"build:noWatch": "babel src --out-dir lib --root-mode upward --ignore '**/*.test.js','**/__tests__'",
"prebuild": "rimraf lib/*"
Run Code Online (Sandbox Code Playgroud)

我目前使用以下命令运行构建:

lerna run build --stream --parallel
Run Code Online (Sandbox Code Playgroud)

但是,我不想为每个包复制这些脚本.我想在一个地方定义脚本,但是在所有包中使用它们.我目前在我的root包中有linting脚本和测试脚本,因为它们有效地遍历整个monorepo寻找测试或文件到lint.将构建脚本移动到那里以及将它们限定在各个包中并不是有意义的.我喜欢这样的事实:当我使用时,每个包都会得到不同的颜色输出lerna run.

一个令人不满意的解决方案是在monorepo的根目录中创建一些shell脚本,并从包的package.json文件中调用它们:

root/packages/example/package.json:

"scripts": {
  "build": "../../scripts/build.sh",
  "build:noWatch": "../../scripts/build.sh",
  "prebuild": "../../scripts/prebuild.sh"
},
Run Code Online (Sandbox Code Playgroud)

然后在root/scripts/build.sh:

#!/bin/sh 

babel src --out-dir lib --root-mode upward --ignore '**/*.test.js','**/__tests__' --watch --verbose 
Run Code Online (Sandbox Code Playgroud)

虽然这有效,但感觉不对:它仍然涉及包之间的重复,并且需要设置shell脚本的权限(这使CI复杂化).

有没有更好的方法在我的所有包中共享这些命令?

javascript package lerna monorepo npm-scripts

10
推荐指数
1
解决办法
837
查看次数

NPM预安装脚本

我试图在安装任何软件包之前运行一些策略脚本.例如:

{
  "name": "pre-hook-check",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "preinstall": "echo preinstall",
    "postinstall": "echo postinstall"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "abc": "^0.6.1",
    "preact": "^8.2.5"
  }
}
Run Code Online (Sandbox Code Playgroud)

上面的示例中的安装前和安装后脚本似乎只在我这样做时才有效npm install,但我希望每次尝试安装任何东西时都会运行.

例如:假设我想编写一个脚本,以便在我的团队运行时检查包的版本npm install <some package>.我想检查安装包的版本并验证它的版本是否高于"1.0.0",否则不要让它们安装.

我打算写一个预安装脚本

npm info lodash version

并检查我尝试安装的任何软件包的版本.如果版本不可用,我计划在安装之前将其设置为交互式并询问用户的确认.

node.js npm npm-install npm-scripts yarnpkg

9
推荐指数
1
解决办法
9356
查看次数

NPM:ENOENT:没有这样的文件或目录,重命名

我在项目上使用gulp,然后我决定删除所有dev依赖项以切换到webpack,但每次我尝试使用npm安装时都会收到此错误:

npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@1.1.3 (node_modules\fsevents):
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: Error: EPERM: operation not permitted, rename 'C:\Users\MiguelFrias\Desktop\Therabytes\node_modules\.staging\fsevents-e80c4ef4\node_modules\are-we-there-yet' -> 'C:\Users\MiguelFrias\Desktop\Therabytes\node_modules\.staging\are-we-there-yet-5db4c798'

npm ERR! path C:\Users\MiguelFrias\Desktop\Therabytes\node_modules\acorn
npm ERR! code ENOENT
npm ERR! errno -4058
npm ERR! syscall rename
npm ERR! enoent ENOENT: no such file or directory, rename 'C:\Users\MiguelFrias\Desktop\Therabytes\node_modules\acorn' -> 'C:\Users\MiguelFrias\Desktop\Therabytes\node_modules\.acorn.DELETE'
npm ERR! enoent This is related to npm not being able to find a file.
npm ERR! enoent

npm ERR! A complete log of this run can …
Run Code Online (Sandbox Code Playgroud)

npm npm-install npm-scripts

9
推荐指数
6
解决办法
1万
查看次数

没有从stylelint/stylelint-config-styled-components获得结果或错误

我正在安装stylelint-config-styled-components一个反应项目.

当我执行npm run lint:css(或直接通过CLI使用stylelint命令)时,我没有得到任何结果.我故意添加了额外的空格和重复的样式声明,所以应该有一些来自stylelint的反馈我已经破坏了规则.但是,我什么也没得到,甚至没有错误信息.有任何想法吗?

我安装了以下软件包:

  • stylelint 9.1.3
  • stylelint-config-recommended 2.1.0
  • stylelint-config-styled-components 0.1.1
  • stylelint-processor-styled-components 1.3.1

我在使用以下脚本package.json:

"scripts": {
    //other scripts
    "lint:css": "stylelint './src/**/*.js'"
}
Run Code Online (Sandbox Code Playgroud)

我的内容.stylelintrc:

{
 "processors": ["stylelint-processor-styled-components"],
 "extends": [
   "stylelint-config-recommended",
   "stylelint-config-styled-components"
 ]
}
Run Code Online (Sandbox Code Playgroud)

我的项目的文件结构(我已经尝试直接在具有相同结果的文件上运行命令,所以我不认为这是一个无法找到.js文件的问题)

-root
    -.stylelintrc
    -src
      -Components
        -Directory
          -ThingIWantLinted.js
        -AnotherDirectory
          -AnotherThingTolint.js
Run Code Online (Sandbox Code Playgroud)

reactjs stylelint npm-scripts styled-components

9
推荐指数
1
解决办法
706
查看次数

你可以在 package.json 中为 npm 脚本设置别名吗?

我有一个项目写在 Typescript

在本地开发时:

ts-node 作为开发依赖项安装,命令是

  to start: "ts-node src/index"
  to init: "ts-node bin/init"
  to init db: "ts-node bin/database-init"
  to migrate db: "ts-node bin/database-migrate"
  to add users: "ts-node bin/add-users"
Run Code Online (Sandbox Code Playgroud)

部署时:

开发依赖项被删除,应用程序被转换,命令是

  to start: "node src/index"
  to init: "node bin/init"
  to init db: "node bin/database-init"
  to migrate db: "node bin/database-migrate"
  to add users: "node bin/add-users"
Run Code Online (Sandbox Code Playgroud)

因此,我被迫在我package.json将继续增长的情况下保持这一点

"scripts": {
  "start": "ts-node src/index",
  "start:js": "node src/index",
  "init": "ts-node bin/init",
  "init:js": "node bin/init",
  "db:init": "ts-node bin/db-init",
  "db:init:js": "node bin/db-init",
  "db:migrate": "ts-node bin/db-migrate",
  "db:migrate:js": …
Run Code Online (Sandbox Code Playgroud)

node.js npm package.json npm-scripts

9
推荐指数
1
解决办法
1万
查看次数

npm脚本:读取.env文件

我有一个简单的要求:在我的npm脚本package.json文件中,有以下一行:

{
    "scripts": {
        "example": "some-lib --argument --domain \"https://tld.com\""
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,我想排除“域”。

首先尝试使用$npm_package_config,它可以工作:

{
    "config": {
        "domain": "https://tld.com"
    },
    "scripts": {
        "example": "some-lib --argument --domain \"$npm_package_config_domain\""
    }
}
Run Code Online (Sandbox Code Playgroud)

但我想从本地.env文件加载域。

我没有找到任何解决方案来在命令行上的npm脚本中读取env文件的内容。

有人可以给我提示解决此问题的方法吗?

npm npm-scripts

9
推荐指数
4
解决办法
3710
查看次数

安装新软件包时 npm-force-resolutions 不起作用

我正在使用的脚本部分package.json来强制解决方案:

"preinstall": "npx npm-force-resolutions"
Run Code Online (Sandbox Code Playgroud)

在分辨率部分,我输入graceful-fs了指定的版本:

"resolutions": {
  "graceful-fs": "^4.2.4",
},
Run Code Online (Sandbox Code Playgroud)

当我运行npm i一切都正确安装时,会考虑设置版本。但是后来当我安装一个额外的模块时,例如npm i random-package,我的设置版本被扔掉了,我最终得到graceful-fs@1.2.3了一些依赖项中的其他低版本。

如果我清除 node_modules 文件夹并npm i再次运行,一切都会再次正常。

我还尝试将分辨率设置得更具体,例如

"resolutions": {
  "glob/**/graceful-fs": "^4.2.4",
},
Run Code Online (Sandbox Code Playgroud)

但这无济于事。

我也试过:

  • 将模块添加为依赖项、devDependency 或 peerDependency
  • 使用收缩包装并将其覆盖在那里

但没有运气。

我错过了什么?

dependencies node.js npm npm-install npm-scripts

9
推荐指数
4
解决办法
1万
查看次数

如何使用 npm postbuild 脚本通用复制文件

我正在运行yarn run build,这将重新创建我的项目的目录构建。问题是:每当完成此操作时,我都会丢失build/中必须包含的一个文件,我手动将其复制并粘贴到那里。

因此,很自然地,我在package.json中创建了以下脚本,以便自动完成:

  "scripts": { 
    "build": "react-scripts build",
    "postbuild": "npm run copy", 
    "copy": "copy Staticfile build"
  },
Run Code Online (Sandbox Code Playgroud)

现在的问题是:它能在 Mac 上运行吗?Linux?我只有 Windows,所以我不知道也无法测试,但我认为它不起作用,因为copy语句在 Windows 上是本机的,但在其他操作系统上却不是......

那么问题是:如何使其通用且独立于操作系统?

谢谢你!

npm-scripts

9
推荐指数
1
解决办法
7939
查看次数

NPM 脚本未显示在资源管理器侧栏中。如何再次展示他们?

我在使用 Visual Studio Code for Windows 10 时遇到了这个问题:我在资源管理器侧栏中再也看不到 NPM 脚本了。

我删除了所有扩展,卸载了 VS Code,同时取消了它的文件夹和扩展文件夹,再次安装了最新版本的 VS Code,没有自定义选项和扩展,但它没有解决我的问题;NPM 脚本菜单不会出现。

我该如何解决这个问题,以便再次显示 NPM 脚本菜单选项?

visual-studio-code npm-scripts vscode-settings

9
推荐指数
7
解决办法
4960
查看次数

为什么要以 root 切换用户身份运行“npm run &lt;script&gt;”?

我在高山图像 ( node:16-alpine) 中设置了一个新项目,/app2结构如下:

- node_modules
  - .bin
    - dummy
- package.json
Run Code Online (Sandbox Code Playgroud)

包.json:

{
  ...
  "scripts": {
    "dummy": "dummy",
  },
  ...
}
Run Code Online (Sandbox Code Playgroud)

假的:

#!/usr/bin/env node

setInterval(() => console.log("."), 1000)
Run Code Online (Sandbox Code Playgroud)

现在,当我使用npm run dummyroot 用户而不是 root 用户运行时,节点命令将使用拥有项目根目录的任何用户运行。例如:

/app2 # ls -lah
...    
drwxr-xr-x    3 node2    node        4.0K Jan 17 08:27 .
...

/app2 # whoami
root

/app2 # npm run dummy
...

# in a different terminal:
/app2 # ps x
...
  816 root      0:00 npm run …
Run Code Online (Sandbox Code Playgroud)

root npm npm-scripts

9
推荐指数
1
解决办法
2825
查看次数