Ian*_*ley 5 php nginx command-line-interface npm
我正在使用 npm install 在其他软件包中安装 gulp-sass。使用 CLI(使用 sudo su forge)可以正常工作:
cd /path/to/package.json/
npm install
Run Code Online (Sandbox Code Playgroud)
package.json 看起来像:
{
"name": "skeleton",
"version": "1.0.0",
"authors": [
"Me <me@mycompany.co.uk>"
],
"private": true,
"devDependencies": {
"gulp": "^3.8.11",
"gulp-autoprefixer": "^2.1.0",
"gulp-concat": "^2.5.2",
"gulp-minify-css": "^1.0.0",
"gulp-notify": "^2.2.0",
"gulp-sass": "^1.3.3",
"gulp-sourcemaps": "^1.5.2",
"gulp-uglify": "^1.2.0"
},
"dependencies": {
"node-notifier": "^4.2.1",
"streamqueue": "^0.1.3"
}
}
Run Code Online (Sandbox Code Playgroud)
在命令行中使用 PHP 也可以正常工作:
php -r "system('npm install');"
Run Code Online (Sandbox Code Playgroud)
但是通过 nginx/PHP-FPM 运行以下 PHP:
<?php
set_time_limit(0);
chdir('/path/to/package.json/');
echo "<pre>";
echo shell_exec('npm install 2>&1');
die();
Run Code Online (Sandbox Code Playgroud)
输出包含以下行的调试文件:
81427 error Linux 4.5.5-x86_64-linode69
81428 error argv "/usr/local/bin/node" "/usr/local/bin/npm" "install"
81429 error node v0.12.7
81430 error npm v2.11.3
81431 error file sh
81432 error path sh
81433 error code ELIFECYCLE
81434 error errno ENOENT
81435 error syscall spawn sh
81436 error node-sass@2.1.1 install: `node scripts/install.js`
81436 error spawn sh ENOENT
81437 error Failed at the node-sass@2.1.1 install script 'node scripts/install.js'.
81437 error This is most likely a problem with the node-sass package,
81437 error not with npm itself.
81437 error Tell the author that this fails on your system:
81437 error node scripts/install.js
81437 error You can get their info via:
81437 error npm owner ls node-sass
81437 error There is likely additional logging output above.
Run Code Online (Sandbox Code Playgroud)
我尝试将这两种情况与以下情况进行比较:
which npm
Run Code Online (Sandbox Code Playgroud)
都返回'/usr/local/bin/npm'
——
echo $USER
Run Code Online (Sandbox Code Playgroud)
两者都返回“伪造”
——
echo $GROUP
Run Code Online (Sandbox Code Playgroud)
都返回''(空)
——
echo $PATH
Run Code Online (Sandbox Code Playgroud)
CLI 返回:
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
Run Code Online (Sandbox Code Playgroud)
PHP 返回:
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Run Code Online (Sandbox Code Playgroud)
——
which sh
Run Code Online (Sandbox Code Playgroud)
都返回'/bin/sh'
——
ps $$
Run Code Online (Sandbox Code Playgroud)
CLI 返回:
PID TTY STAT TIME COMMAND
13111 pts/2 S 0:00 bash
Run Code Online (Sandbox Code Playgroud)
PHP 返回:
PID TTY STAT TIME COMMAND
25759 ? S 0:00 sh -c ps $$
Run Code Online (Sandbox Code Playgroud)
——
npm -v
Run Code Online (Sandbox Code Playgroud)
都返回 '2.11.3'
——
npm version
Run Code Online (Sandbox Code Playgroud)
CLI 返回:
{ skeleton: '1.0.0',
npm: '2.11.3',
http_parser: '2.3',
modules: '14',
node: '0.12.7',
openssl: '1.0.1p',
uv: '1.6.1',
v8: '3.28.71.19',
zlib: '1.2.8' }
Run Code Online (Sandbox Code Playgroud)
PHP 返回没有骨架 1.0.0:
{ npm: '2.11.3',
http_parser: '2.3',
modules: '14',
node: '0.12.7',
openssl: '1.0.1p',
uv: '1.6.1',
v8: '3.28.71.19',
zlib: '1.2.8' }
Run Code Online (Sandbox Code Playgroud)
——
npm 配置 ls -l
CLI 返回:
; cli configs
long = true
user-agent = "npm/2.11.3 node/v0.12.7 linux x64"
; userconfig /home/forge/.npmrc
ignore-scripts = false
loglevel = "info"
prefix = "/home/forge/npm"
progress = false
; default values
access = null
always-auth = false
bin-links = true
browser = null
ca = null
cache = "/home/forge/.npm"
cache-lock-retries = 10
cache-lock-stale = 60000
cache-lock-wait = 10000
cache-max = null
cache-min = 10
cafile = undefined
cert = null
color = true
depth = null
description = true
dev = false
editor = "vi"
engine-strict = false
fetch-retries = 2
fetch-retry-factor = 10
fetch-retry-maxtimeout = 60000
fetch-retry-mintimeout = 10000
force = false
git = "git"
git-tag-version = true
global = false
globalconfig = "/home/forge/npm/etc/npmrc"
globalignorefile = "/home/forge/npm/etc/npmignore"
group = 1013
heading = "npm"
https-proxy = null
if-present = false
ignore-scripts = false
init-author-email = ""
init-author-name = ""
init-author-url = ""
init-license = "ISC"
init-module = "/home/forge/.npm-init.js"
init-version = "1.0.0"
json = false
key = null
link = false
local-address = undefined
; loglevel = "warn" (overridden)
; long = false (overridden)
message = "%s"
node-version = "0.12.7"
npat = false
onload-script = null
optional = true
parseable = false
; prefix = "/usr/local" (overridden)
production = false
proprietary-attribs = true
proxy = null
rebuild-bundle = true
registry = "https://registry.npmjs.org/"
rollback = true
save = false
save-bundle = false
save-dev = false
save-exact = false
save-optional = false
save-prefix = "^"
scope = ""
searchexclude = null
searchopts = ""
searchsort = "name"
shell = "/bin/bash"
shrinkwrap = true
sign-git-tag = false
spin = true
strict-ssl = true
tag = "latest"
tag-version-prefix = "v"
tmp = "/tmp"
umask = 2
unicode = true
unsafe-perm = true
usage = false
user = 1013
; user-agent = "npm/{npm-version} node/{node-version} {platform} {arch}" (overridden)
userconfig = "/home/forge/.npmrc"
version = false
versions = false
viewer = "man"
Run Code Online (Sandbox Code Playgroud)
PHP 返回:
; cli configs
long = true
user-agent = "npm/2.11.3 node/v0.12.7 linux x64"
; userconfig /home/forge/.npmrc
ignore-scripts = false
loglevel = "warn"
prefix = "/home/forge/npm"
progress = false
; default values
access = null
always-auth = false
bin-links = true
browser = null
ca = null
cache = "/home/forge/.npm"
cache-lock-retries = 10
cache-lock-stale = 60000
cache-lock-wait = 10000
cache-max = null
cache-min = 10
cafile = undefined
cert = null
color = true
depth = null
description = true
dev = false
editor = "vi"
engine-strict = false
fetch-retries = 2
fetch-retry-factor = 10
fetch-retry-maxtimeout = 60000
fetch-retry-mintimeout = 10000
force = false
git = "git"
git-tag-version = true
global = false
globalconfig = "/home/forge/npm/etc/npmrc"
globalignorefile = "/home/forge/npm/etc/npmignore"
group = 1000
heading = "npm"
https-proxy = null
if-present = false
ignore-scripts = false
init-author-email = ""
init-author-name = ""
init-author-url = ""
init-license = "ISC"
init-module = "/home/forge/.npm-init.js"
init-version = "1.0.0"
json = false
key = null
link = false
local-address = undefined
loglevel = "warn"
; long = false (overridden)
message = "%s"
node-version = "0.12.7"
npat = false
onload-script = null
optional = true
parseable = false
; prefix = "/usr/local" (overridden)
production = false
proprietary-attribs = true
proxy = null
rebuild-bundle = true
registry = "https://registry.npmjs.org/"
rollback = true
save = false
save-bundle = false
save-dev = false
save-exact = false
save-optional = false
save-prefix = "^"
scope = ""
searchexclude = null
searchopts = ""
searchsort = "name"
shell = "bash"
shrinkwrap = true
sign-git-tag = false
spin = true
strict-ssl = true
tag = "latest"
tag-version-prefix = "v"
tmp = "/tmp"
umask = 18
unicode = true
unsafe-perm = true
usage = false
user = 1000
; user-agent = "npm/{npm-version} node/{node-version} {platform} {arch}" (overridden)
userconfig = "/home/forge/.npmrc"
version = false
versions = false
viewer = "man"
Run Code Online (Sandbox Code Playgroud)
——
报告的潜在相关配置差异是:
- group (1013 / 1000)
- shell (/bin/bash / bash) - I've tried using /bin/bash -c "npm install" but it seems to make no difference.
- umask (2 / 18)
- user (1013 / 1000) (user 1000 is "forge", user 1013 is myself)
Run Code Online (Sandbox Code Playgroud)
我都没有想法了。如果您对为什么引入 nginx/php-fpm 会导致此问题有任何想法,我们将不胜感激。
非常感谢。
似乎$PATH
不包括/bin
作为 npm 脚本调用时的内容,因此无法找到/bin/sh
per error file sh
。
解决方案是将符号链接/bin/sh
到/usr/bin/sh
:
ln -s /bin/sh /usr/bin/sh
Run Code Online (Sandbox Code Playgroud)