无法在 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

Deployer 的使用

Eclipse 中Deployment Assembly 无法正常显示

无法执行目标org.apache.maven.plugins:maven-deploy-plugin:2.7:在项目上部署default-deploy

如何在 Laravel 中更改默认路径“/public”名称

无法在 laravel 项目中使用 composer 安装 blocktrail/blocktrail-sdk