无法在 Laravel 项目中使用 deploy.sh 文件运行“npm run prod”(使用 Laravel Mix)
Posted
技术标签:
【中文标题】无法在 Laravel 项目中使用 deploy.sh 文件运行“npm run prod”(使用 Laravel Mix)【英文标题】:Can't run "npm run prod" using a deploy.sh file in a Laravel project (using Laravel Mix) 【发布时间】:2021-10-08 18:31:06 【问题描述】:我可以运行“npm run prod
”。我将相同的命令放在deploy.sh
文件中。同样,我仍然可以使用./deploy.sh,
运行部署脚本并且它可以工作。但是当 git 钩子发生时,相同的部署脚本无法运行。
"npm i
" 可以在终端、部署脚本和使用 git hook 中工作。
deploy.sh
脚本如下:
#!/bin/sh
php artisan down
git pull origin $1
composer install --no-interaction --prefer-dist --optimize-autoloader --no-dev
php artisan migrate --force
php artisan cache:clear
php artisan route:cache
php artisan config:cache
npm ci
# everything works fine, but the line below
npm run production
php artisan up
奇怪的是,在终端中,当我运行./deploy.sh
时,一切正常,没有任何问题。但是当使用 GitHub webhook 调用部署脚本时,它会抛出以下错误:
所以,npm run prod
在终端中有效,当我在终端中通过./deploy.sh
运行部署脚本时有效,但当 git 挂钩调用 laravel 应用程序运行部署脚本时无效。
这就是我使用 laravel 运行 deploy.sh 文件的方式:
$process = new Process(['./deploy.sh']);
$process->setWorkingDirectory(base_path());
$process->run(function ($type, $buffer)
Log::info($buffer);
);
我已经尝试过的:
使用cross-env
:不工作。
使用rm -rf node_modules & npm cache clean --force & npm i
:不工作。
【问题讨论】:
尝试将package.json
中的mix --production
更改为node_modules/.bin/mix --production
在#!/bin/sh
之后的行上添加set -e
- 这将使脚本在第一个错误处停止。 npm ci
可能失败并离开部署机器而没有安装 npm 依赖项,但无论如何脚本仍在继续。
因此,当您使用 CLI 尝试脚本时,您的脚本可以正常工作,但从 Github Webhook 触发时则不行。检查将在 webhook 之后发出命令的 Linux 用户是否具有与您的 shell 用户相同的权限。您可以通过自己执行命令/脚本进行检查,但 Linux 用户 github 将“使用”吗?您可以测试“which npm”或“locate npm”之类的内容来与您在 cli 中运行这些命令进行比较吗?这可能是一个环境问题,例如路径、权限……当您从 Laravel 运行时,与您的 shell 用户相比,PHP 用户可能没有足够的权限。也尝试在 npm 上使用详细
@behz4d 是的,这有点奇怪。尽管如此,npm run production 仍需要访问一些资产、node-sass 之类的包或类似的东西。我同意 npm/node 路径可能不是问题。我会尝试以详细的方式运行 npm run production 以查明真正的问题(在某处拒绝访问,未找到,缺少包......),因为对我来说唯一的区别是运行脚本的 Linux 用户。也许尝试 sudo (仅用于测试目的)看看它是否更好。
正如 Mtxz 所说,您运行 ./deploy.sh
与运行它的 webhook 不同,因为它是具有不同环境的不同用户。 ENOENT 错误表明您正在引用 webhook 用户无法访问的文件,或者您在某处具有在 webhook 正在使用的 PWD 上下文中无效的相对路径。假设 webhook 以用户 webhook
运行,试试这个:sudo -u webhook ./deploy.sh
以确定它是否与用户相关。 EDIT:
找到 sh
的位置并将其替换为 /bin/sh
,webhook 可能正在清除路径变量。
【参考方案1】:
您的代码在我这边无法重现。但是我的假设是 laravel 的log:info
$buffer 的标准输出与主进程的日志标准输出发生冲突。禁用日志记录或更改日志记录级别并尝试上述过程。它应该可以工作。
【讨论】:
【参考方案2】:您是否正在运行正确的命令?您谈到在本地运行npm run prod
,但在您的deploy.sh
文件中它是npm run production
?
【讨论】:
以上是关于无法在 Laravel 项目中使用 deploy.sh 文件运行“npm run prod”(使用 Laravel Mix)的主要内容,如果未能解决你的问题,请参考以下文章
Laravel文档阅读笔记-How to deploy Laravel 8 project on Cpanel shared hosting
Eclipse 中Deployment Assembly 无法正常显示
无法执行目标org.apache.maven.plugins:maven-deploy-plugin:2.7:在项目上部署default-deploy