- 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 install --save firebase 在 ubuntu 控制台上安装 firebase并在安装过程中出现以下错误,我尝试安装 npm install protobu
将软件包添加到cygwin时,总是会出现错误,例如: 包装:未知包装 autorebase.bat退出代码1 /var/log/setup.log.full指示问题: 2013/12/02 10:07
我错了 原因npm install whatever删除 node_modules/-文件夹不同:我认为它运行 preinstall但没有postinstall我错了。 我没有运行这两个脚本。 原因似
我开发了一个 npm 包(“node_commons”),它包含在我的其他项目中,如下所示: package.json(其他项目) "node-commons": "git+ssh://git@sta
我有带有以下 package.json 的 npm 模块 { "name": "my-app", "version": "0.0.0", "scripts": { "prepubl
这可能更像是一个澄清问题: 根据 Ivy 的文档(自 Angular 9 起),我们需要将 postinstall 脚本添加到我们的 package.json 中,如下所示: "postinstall
* Listening on tcp://0.0.0.0:3000 Started GET "postinstall/" for 127.0.0.1 at 2013-10-27 07:26:15 +0
在我的 composer.json 中,有一个 postinstall Hook 设置,如下所示: "scripts" : { "dist" : "node dist; node
我正在尝试从 grunt 的 scripts.postinstall 运行多个 CLI 命令。我不知道如何让两者都运行。如果我添加第二个命令都不会运行。它们分别在安装后和控制台中工作。 我已经尝试将它
我在 npm 上创建了一个包,它创建了一个“scss 目录结构”,我想将自定义脚本复制/添加到项目根目录下的 package.json 文件中。 MY-PROJECT ├── node_modules
Npm 提供了一种在安装每个包后执行自定义可执行文件或脚本的方法(请参阅 Hook Scripts )。 这是我编写的一个小钩子(Hook)脚本: hook-test-npm/node_modules
如果以下问题对您来说很幼稚,请原谅: 我经历了由 angular 9 开发的多个项目,其中大多数在 package.json 中有以下行作为 posinstall 脚本。"postinstall":
我只想运行 npm 的安装后脚本一次(在第一次不带参数的 npm install 之后) 我尝试查看文档,但找不到任何内容。关于如何执行此操作的任何想法(除了在第一次运行安装后时保存本地文件之外?)
我有一个 npm 包(npm v 5.5.1 和 Node 版本是 9.2.0)。如果我在本地机器上运行 npm install 然后执行 package.json 中定义的 postinstall
我正在使用 Heroku 来托管我的应用程序并使用 webpack 来构建它。 基本上,我正在尝试部署我的应用程序,但它根本不起作用。 安装后似乎没有发生,因为当我加载页面时它缺少文件 bundle.
我想在运行后自动将某些文件从 npm 包复制到用户的本地目录 npm install my-package 我可以通过在 package.json 中声明 "files" 来安装它们。问题是---文件
我在网上窥探了超过 48 小时,但未能解决这个问题。 当我运行命令“npm install”时,它无法执行安装后脚本“bower install”。因此,我使用以下方法进行了明确的 bower 安装:
我有一个要发布到 NPM 的包,其中还包含如下所示的演示目录: . +-- demo | +-- src | | +-- main.js | +-- package.json +--
我目前正在使用层meta-azure-device-update 和meta-swupdate 进行Azure 设备更新。我想运行安装后脚本。我关注了下面提到的来源: 1.sw-描述.rst http
我有一个 postinstall 脚本,我假设每当您执行 git push heroku master 时都会调用该脚本。但由于某种原因,推送失败了。我在 Windows 上,必须对某些脚本使用 cr
我是一名优秀的程序员,十分优秀!