- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我开始玩Snowpack。它与Webpack采取了不同的方法,即在安装各个软件包后立即捆绑它们。
“问题”是,当我安装软件包时,我必须先运行npm install --save my-package
,然后必须手动将其与npx snowpack
打包在一起。 Snowpack docs提到我可以包含一个prepare
脚本,该脚本在运行snowpack
之后将对所有内容进行npm install
,但不适用于单个软件包,仅适用于npm install
中所有依赖项的通用package.json
。据我所知,npm docs中提到的所有npm挂钩都是这种情况。
每当安装单个软件包时,有什么方法可以自动运行脚本?我能想到的唯一方法是覆盖安装脚本并向其中添加一些内容。在GitHub或其他地方有任何示例吗?
更新:为澄清起见,每次安装带有npx snowpack
的新软件包时,我都希望运行--save
,但最好不要安装--save-dev
或不安装--save
。这对于任何软件包都不会有什么不同。这将特定于某个回购/项目,而不是系统上的全局项目。
仅运行snowpack
后仅运行npm install
是不够的,因为您可以钩入postinstall
或release
。另外,我想确保在我的项目上工作的开发人员可以像往常一样使用npm install --save newdep
,然后snowpack
将运行。我不想要求开发人员使用自定义的命名脚本。
最佳答案
简短答案:不幸的是,npm不提供任何内置功能来满足您的要求。
诸如postinstall
之类的生命周期挂钩/脚本仅在运行通用npm install
命令时被调用,而在项目开发阶段中有人在运行npm install --save <pkg_name>
时则不被调用。
解决方法:考虑通过从本质上在外壳程序级别覆盖npm install --save
命令来定制npm
复合命令的逻辑。
以下解决方案(尽管是Bash解决方案)描述了如何针对特定项目实现这种自定义逻辑。但是,此解决方案取决于以下条件:
运行npm install --save
复合命令时,从事您的项目的开发人员必须将其shell设置为Bash。
在您的项目上工作的开发人员将需要自定义其Bash startup files,即~/.bashrc
,可能还有~/.bash_profile
。
项目目录(即您希望自定义逻辑对其生效的项目目录)必须包含自定义.bashrc
文件。
重击解决方案:
以下三个步骤是配置项目和操作系统所必需的,以便开发人员运行npm install --save <pkg_name>
(或其变体)时,随后将调用npx snowpack
命令。
注意:第二点和第三点(以下)是开发人员自定义Bash启动文件所需执行的任务。
项目特定的.bashrc
文件:
首先,在项目目录的根目录中创建以下“特定于项目的” .bashrc
文件,即,将其保存在与项目package.json
文件所在的目录相同的级别:/some/path/to/my-project/.bashrc
npm() {
local name_badge="\x1b[37;40mpostinstall\x1b[0m"
array_includes() {
local word=$1
shift
for el in "$@"; do [[ "$el" == "$word" ]] && return 0; done
}
log_warn_message() {
local cmd_name=$1 warn_badge warn_mssg
warn_badge="\x1b[30;43mWARN!\x1b[0m"
warn_mssg="${cmd_name} command not found. Cannot run npx snowpack."
echo -e "\n${name_badge} ${warn_badge} ${warn_mssg}" >&2
}
log_run_message() {
echo -e "\n${name_badge} Running pseudo postinstall hook."
}
if [[ $* == "install "* || $* == "i "* ]] && array_includes --save "$@"; then
# 1. Run the given `npm install --save ...` command.
command npm "$@"
# 2. Check whether the `npx` command exists globally.
command -v npx >/dev/null 2>&1 || {
log_warn_message npx
return 1
}
log_run_message
# 3. Run the pseudo "postinstall" command.
command npx snowpack
else
# Run all other `npm` commands as per normal.
command npm "$@"
fi
}
~/.bashrc
文件:
npm
文件中的
.bashrc
函数)生效,必须将Bash配置为读取上述“特定于项目的”
.bashrc
文件。要进行配置,请将以下代码行添加到
~/.bashrc
:
PROMPT_COMMAND='if [[ "$bashrc" != "$PWD" && "$PWD" != "$HOME" && -e .bashrc ]]; then bashrc="$PWD"; . .bashrc; fi'
~/.bash_profile
文件:
~/.bash_profile
包含以下代码行以加载
~/.bashrc
文件(或其某些变体):
if [ -f ~/.bashrc ]; then . ~/.bashrc; fi
~/.bash_profile
。
echo $'\n'"PROMPT_COMMAND='if [[ \"\$bashrc\" != \"\$PWD\" && \"\$PWD\" != \"\$HOME\" && -e .bashrc ]]; then bashrc=\"\$PWD\"; . .bashrc; fi'" >> ~/.bashrc
PROMPT_COMMAND=...
代码行添加到现有的
~/.bashrc
文件中,或者如果尚不存在,则创建一个新的代码行:
~/.bash_profile
中添加用于加载
~/.bashrc
文件所需的代码行:
echo $'\n'"if [ -f ~/.bashrc ]; then . ~/.bashrc; fi" >> ~/.bash_profile
echo $0
-bash
,则说明它正在使用Bash。
echo $0
不打印
-bash
,则需要更改外壳。要将其更改为Bash,请运行:
chsh -s /bin/bash
.bashrc
文件:
.bashrc
文件包含名为
npm
的
shell function。该函数的主体包含重写默认的
npm install|i --save
命令所必需的逻辑。
if
语句中指定的条件,即读取的部分;
if [[ $* == "install "* || $* == "i "* ]] && array_includes --save "$@"; then
...
fi
$*
special parameter来检查传递给
npm
函数的参数是否以这两者开头。
install
,或者是速记等效项
i
,以及是否也传递了
--save
选项/参数。
--save
参数的存在,我们将
$@
特殊参数传递给
array_includes
函数。我们对此参数的处理方式不同,因为
--save
选项的位置在复合命令中可能有所不同。例如,用户可以通过运行此软件包来安装软件包;
# Example showing `--save` option at the end
npm install <pkg_name> --save
# Example showing `--save` option in the middle
npm i --save <pkg_name>
if
语句中指定的条件(即它们为
true
)时,我们将在其正文中执行以下任务:
npm install --save ...
命令:
command npm "$@"
npx
命令是否全局存在:
command -v npx >/dev/null 2>&1 || {
log_warn_message npx
return 1
}
npx
命令不可用(全局),则警告用户无法运行
npx snowpack
命令,并警告该功能
return
早期退出,且退出状态为
1
。
npx
。但是,如果要在项目中本地安装
npm
,则需要更改此逻辑。也许通过检查
./node_modules/.bin/npx
是否存在。或者,您可能确信
npx
命令将始终存在,因此得出结论,此检查是不必要的。
npx
命令是全局存在的,则我们运行伪的“ postinstall”命令,即
command npx snowpack
if
语句中指定的条件(即它们为
false
)时,用户实际上正在运行任何其他非
npm install --save <pkg_name>
的npm命令。因此,在
else
分支中,我们按原样运行命令:
command npm "$@"
PROMPT_COMMAND
变量描述如下:
PROMPT_COMMAND
$PS1
)之前执行的命令。
PROMPT_COMMAND='if [[ "$bashrc" != "$PWD" && "$PWD" != "$HOME" && -e .bashrc ]]; then bashrc="$PWD"; . .bashrc; fi'
.bashrc
(如果存在的话),该
npm
依次使用
npm
函数覆盖
npm install --save
命令。这实际上是为特定项目覆盖覆盖
@Cyrus
复合命令的机制。
关于npm - 在npm安装单个软件包后运行脚本(如postinstall)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59934610/
我正在使用npm v5.3.0。 现在,我想将npm更新到v5.4.1。要执行此操作,请在终端中键入以下内容: npm install -g npm 没有任何错误。但是,当我键入npm -v时,得到的
我已经使用 vue-cli 两个星期了,直到今天一切正常。我在本地建立这个项目。 https://drive.google.com/open?id=0BwGw1zyyKjW7S3RYWXRaX24tQ
有什么方法可以更改或重置全局 npm 注册表。 感谢您的帮助。 最佳答案 在终端中运行以下命令以恢复到默认注册表 npm config set registry https://registry.np
查看 npm 的 documentation , 'i' 是 'install' 的别名,是否有任何情况下最好使用完整的 'npm install'? 最佳答案 两者之间没有具体区别。这只是一个懒惰的
目前,每次将更改推送到 GIT 存储库时,我都会发布新版本的 NPM 包。我的大部分更改只是愚蠢的补丁。我使用 NPM 作为工具,在我的许多项目中启用版本控制和代码重用。经过一个月的工作,我已经完成了
我运行的时候总是报错 npm install 谁知道怎么解决 npm ERR! Darwin 13.0.0 npm ERR! argv "/usr/local/bin/node" "/usr/b
“npm uninstall packageName”删除包并更新 package.json 文件。 但是来自 npm 文档 - To remove a package from the depend
我的背景更熟悉 composer .我收到 gulp (等)进行构建过程和学习 node以及如何使用 npm我走的时候。 很奇怪(再次来自 composer 背景)composer.lock默认情况下
我看到的许多 npm 模块名称前面都添加了技术名称,例如 react-native 或 jquery 等。由于我们已经在 package.json 文件中提供了关键字,因此遵循此约定有什么好处。我问这
我检查了 connect-privkey-to-provider模块在依赖项中。但是,它一直在说 模块 'connect-privkey-to-provider' 是无关的 npm 和 找不到模块 '
我正在进行持续集成并发现了 npm ci命令。 我不知道在我的工作流程中使用此命令有什么优势。 速度更快吗?这会让测试变得更难吗?好吗? 最佳答案 来自the official documentati
我有一个要发布到 NPM 的包,其中还包含如下所示的演示目录: . +-- demo | +-- src | | +-- main.js | +-- package.json +--
如果我打开集成终端并运行 npm -v 它会起作用。 但是,如果我直接从 NPM SCRIPTS 运行它,它就不起作用。 评论中要求的更多详细信息 //由 Fogmeister 编辑 我也有这个问题,
我正在尝试安装 gulp,当我写 npm install 时我得到了这个问题: npm ERR! code 1 npm ERR! path D:\www\wegrow\node_modules\nod
这个问题已经有答案了: npm test --codecoverage doesn't generate report (3 个回答) 已关闭 4 年前。 当我执行npm test --code-co
我能够运行 npm start 和 npm run start 命令。我用过create-react-app创建我的应用程序。为了在 CSS 模块中进行配置更改,我想运行 npmject 但它会抛出错
我正在使用npm run script执行“构建”和“测试”等任务。 例如,我的 package.json 如下所示: { "name": "fulfillment-service", "ve
我第一次将 npm 模块添加到我的项目中(jshint、optimg、jpgo)。我注意到有些项目,当我做 npm 运行 [名称] ,给出“sh: [name]: command not found”
我已经在 Windows 上安装了 Ubuntu Bash。我已经有 nodejs和 npm在我的 Windows 机器上 C:\Program Files\nodejs .在 Windows 的 b
我正在尝试运行 npm install bitgo命令但在终端上出现以下错误, npm ERR! code EMFILE npm ERR! syscall spawn git npm ERR! pat
我是一名优秀的程序员,十分优秀!