【问题标题】:Can't run "npm run prod" using a deploy.sh file in a Laravel project (using Laravel Mix)无法在 Laravel 项目中使用 deploy.sh 文件运行“npm run prod”(使用 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 可能正在清除路径变量。

标签: node.js laravel webpack deployment laravel-mix


【解决方案1】:

您的代码在我这边无法重现。但是我的假设是 laravel 的log:info $buffer 的标准输出与主进程的日志标准输出发生冲突。禁用日志记录或更改日志记录级别并尝试上述过程。它应该可以工作。

【讨论】:

    【解决方案2】:

    您是否正在运行正确的命令?您谈到在本地运行npm run prod,但在您的deploy.sh 文件中它是npm run production

    【讨论】:

      猜你喜欢
      • 2021-11-30
      • 2020-10-01
      • 1970-01-01
      • 2017-09-22
      • 2021-09-09
      • 2019-08-08
      • 1970-01-01
      • 2021-07-22
      • 1970-01-01
      相关资源
      最近更新 更多