我有一个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复杂化).
有没有更好的方法在我的所有包中共享这些命令?
我试图在安装任何软件包之前运行一些策略脚本.例如:
{
"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
并检查我尝试安装的任何软件包的版本.如果版本不可用,我计划在安装之前将其设置为交互式并询问用户的确认.
我在项目上使用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) 我正在安装stylelint-config-styled-components一个反应项目.
当我执行npm run lint:css(或直接通过CLI使用stylelint命令)时,我没有得到任何结果.我故意添加了额外的空格和重复的样式声明,所以应该有一些来自stylelint的反馈我已经破坏了规则.但是,我什么也没得到,甚至没有错误信息.有任何想法吗?
我安装了以下软件包:
我在使用以下脚本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) 我有一个项目写在 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) 我有一个简单的要求:在我的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文件的内容。
有人可以给我提示解决此问题的方法吗?
我正在使用的脚本部分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)
但这无济于事。
我也试过:
但没有运气。
我错过了什么?
我正在运行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 上是本机的,但在其他操作系统上却不是......
那么问题是:如何使其通用且独立于操作系统?
谢谢你!
我在使用 Visual Studio Code for Windows 10 时遇到了这个问题:我在资源管理器侧栏中再也看不到 NPM 脚本了。
我删除了所有扩展,卸载了 VS Code,同时取消了它的文件夹和扩展文件夹,再次安装了最新版本的 VS Code,没有自定义选项和扩展,但它没有解决我的问题;NPM 脚本菜单不会出现。
我该如何解决这个问题,以便再次显示 NPM 脚本菜单选项?
我在高山图像 ( 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) npm-scripts ×10
npm ×6
node.js ×3
npm-install ×3
dependencies ×1
javascript ×1
lerna ×1
monorepo ×1
package ×1
package.json ×1
reactjs ×1
root ×1
stylelint ×1
yarnpkg ×1