在 Laravel Forge-Setup 中从 Laravel 应用程序执行 "npm"



我开发了一个工具,它生成一个scss文件,运行npm-run prod并将生成的app.css上传到服务器。

在当地,这没有问题。我只是简单地运行了shell_exec('npm run production'),它成功地工作了。

现在,今天,我向Laravel Forge管理的DigitalOcean服务器推出了该工具。现在,NPM命令的执行已经不起作用了。相反,我在运行npm run production:时看到了这个错误

ERR! file sh
npm ERR! path sh
npm ERR! code ELIFECYCLE
npm ERR! errno ENOENT
npm 

当我现在将脚本更改为npm -v时,我看到的是:

6.9.0

有人知道,如何让NPM在这里运行吗?

(production是此命令的别名:cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --no-progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js(

更新:

现在,我试着用纱线。运行yarn install运行良好。结果是意料之中的。但是运行纱线运行开发出现以下错误:

2020-11-07 20:03:55 STDOUT: yarn run v1.17.3
2020-11-07 20:03:55 STDOUT: $ npm run development
2020-11-07 20:03:55 STDERR: /bin/sh: 1: 
2020-11-07 20:03:55 STDERR: npm: not found
2020-11-07 20:03:55 STDERR: error Command failed with exit code 127.
2020-11-07 20:03:55 STDOUT: info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.

如果我在完全相同的目录中通过ssh手动运行yarn运行开发,那么一切都很好。

更新2:我想,也许问题是,Laravel是由SSH中的另一个用户执行的。但两者都是用户forge

我找到了两种可能的解决方案。

其中一个是几年前关于shell_execnpm的问题,解决方案是$PATH在作为npm脚本调用时不包括/bin,因此无法在每个error file sh中找到/bin/sh(不是我的话,请参阅原始问题(。他们的解决方案是将/bin/sh符号链接到/usr/bin/sh:

ln -s /bin/sh /usr/bin/sh

另一种解决方案可能是使用Symony的Process:

use SymfonyComponentProcessProcess;
(new Process(['npm', 'run', 'production'], base_path()))
->setTimeout(null)
->run(function ($type, $output) {
$this->output->write($output);
});

这两种解决方案都没有经过测试,因为我目前无法访问DigitalOcean服务器或Laravel Forge帐户。

最新更新