我对一些npm包有各种权限和/或路径问题,这次是部署的dpd二进制文件。然而,它似乎仍然与我时不时收到的任何其他熟悉的令人沮丧的npm路径问题有关。这是一个非常熟悉的npm用法,似乎,鉴于我经常使用-g,而不是,当安装npm包…
到目前为止,为了解决这个问题,我从用户和全球范围多次尝试重新安装deployed和mongodb,甚至重新安装了npm。运行dpd时,im得到一致的包错误。我发现了很多相关的东西,但没有一个有用。这是我今天运行DPD时遇到的问题。有什么好建议吗?
当从linux运行时
美元DPD
开始部署v0.8.4…
启动MongoDB失败(请确保'mongod'位于$path或使用dpd--mongod选项)。参考:http://docs.deployd.com/docs/basics/cli.html)
再见
$ sudo dpd
starting deployd v0.8.4...
Failed to start MongoDB (Make sure 'mongod' are in your $PATH or use dpd --mongod option. Ref: http://docs.deployd.com/docs/basics/cli.html)
bye
$ dpd --mongod ./.dpd/pids
starting deployd v0.8.4...
child_process.js:1162
throw errnoException(err, 'spawn');
^
Error: spawn EACCES
at exports._errnoException (util.js:746:11)
at ChildProcess.spawn (child_process.js:1162:11)
at exports.spawn (child_process.js:995:9)
at Object.exports.restart (/usr/bin/node_modules/bin/lib/node_modules/deployd/lib/util/mongod.js:38:14)
at start (/usr/bin/node_modules/bin/lib/node_modules/deployd/bin/dpd:149:16)
at Object.<anonymous> (/usr/bin/node_modules/bin/lib/node_modules/deployd/bin/dpd:280:31)
at Module._compile (module.js:460:26)
at Object.Module._extensions..js (module.js:478:10)
at Module.load (module.js:355:32)
at Function.Module._load (module.js:310:12)
at Function.Module.runMain (module.js:501:10)
at startup (node.js:129:16)
at node.js:814:3
即使我运行sudo,我也会得到同样的错误。
$ sudo dpd --mongod ./.dpd/pids
starting deployd v0.8.4...
child_process.js:1162
throw errnoException(err, 'spawn');
^
Error: spawn EACCES
at exports._errnoException (util.js:746:11)
at ChildProcess.spawn (child_process.js:1162:11)
at exports.spawn (child_process.js:995:9)
at Object.exports.restart (/usr/bin/node_modules/bin/lib/node_modules/deployd/lib/util/mongod.js:38:14)
at start (/usr/bin/node_modules/bin/lib/node_modules/deployd/bin/dpd:149:16)
at Object.<anonymous> (/usr/bin/node_modules/bin/lib/node_modules/deployd/bin/dpd:280:31)
at Module._compile (module.js:460:26)
at Object.Module._extensions..js (module.js:478:10)
at Module.load (module.js:355:32)
at Function.Module._load (module.js:310:12)
at Function.Module.runMain (module.js:501:10)
at startup (node.js:129:16)
at node.js:814:3
当在samba共享映射网络驱动器上从windows运行时
dpd > fs: missing callback Error: EPERM, open 'C:\Program Files (x86)\Deployd\node_modules\deployd\.latestversion'
我在这里做错什么了?
我找不到这个文件,也找不到这行代码,
子进程js:1162
抛出errnoexception(err,'spawn');
当我为它grep时,一个引用出现在代码行中,即/bin/node,当我在vim中打开它时,它看起来是加密的……我想我再看一遍,那条线可能在那儿…隐马尔可夫模型。
好的,我在node二进制文件中找到了那一行,
this.spawnfile = options.file;
var err = this._handle.spawn(options);
// Run-time errors should emit an error, not throw an exception. if (err === uv.UV_EAGAIN ||
err === uv.UV_EMFILE ||
err === uv.UV_ENFILE ||
err === uv.UV_ENOENT) {
process.nextTick(function() {
self._handle.onexit(err);
});
// There is no point in continuing when we've hit EMFILE or ENFILE
// because we won't be able to set up the stdio file descriptors.
// It's kind of silly that the de facto spec for ENOENT (the test suite)
// mandates that stdio _is_ set up, even if there is no process on the
// receiving end, but it is what it is.
if (err !== uv.UV_ENOENT) return err; } else if (err) {
// Close all opened fds on error
stdio.forEach(function(stdio) {
if (stdio.type === 'pipe') {
stdio.handle.close();
}
});
this._handle.close();
this._handle = null;
throw errnoException(err, 'spawn'); }
这是一种疯狂的许可错误吗?我想我把所有文件设置为755,作为用户运行时也设置为dirs。没有安装selinux,可能有一些facl…怀疑一下,在这个方向…
我重新安装了npm和nodejs,但没有帮助。这是在一个拱形Linux盒子上。
编辑:是的,这也不是出于某种原因,即使在我通过纠正权限问题解决了另一个问题之后。
$ dpd -d --mongod /usr/bin/node_modules/bin/lib/node_modules
starting deployd v0.8.4...
deployd v0.8.5 is available.
child_process.js:1162
throw errnoException(err, 'spawn');
^
Error: spawn EACCES
at exports._errnoException (util.js:746:11)
at ChildProcess.spawn (child_process.js:1162:11)
at exports.spawn (child_process.js:995:9)
at Object.exports.restart (/usr/bin/node_modules/bin/lib/node_modules/deployd/lib/util/mongod.js:38:14)
at start (/usr/bin/node_modules/bin/lib/node_modules/deployd/bin/dpd:149:16)
at Object.<anonymous> (/usr/bin/node_modules/bin/lib/node_modules/deployd/bin/dpd:280:31)
at Module._compile (module.js:460:26)
at Object.Module._extensions..js (module.js:478:10)
at Module.load (module.js:355:32)
at Function.Module._load (module.js:310:12)
at Function.Module.runMain (module.js:501:10)
at startup (node.js:129:16)
at node.js:814:3
最佳答案
注意,这意味着它是一个权限问题。dpd的权限需要正确的访问才能运行。检查EACCESS
二进制文件的权限,这是dpd
错误的潜在原因。可能因为EACCESS
作为sudo运行,catch 22可能变成了自从作为sudo运行以来,权限没有设置在dpd链的某个位置,甚至可能是符号链接本身,所以您需要手动转到/usr/bin/node-modules/bin/bin/pdp to/lib/node-modules/deployed/bin中的二进制符号链接并重置其中的权限。
然而,深入思考,问题可能是由于从sudo运行的dpd安装本身,因为npm可能已经为这个逻辑链添加了一个很好的错误输出。
另外,还需要检查linux用户dir中.npm的permmissions,有些事情可能是以root和/或sudo的身份完成的。您需要递归地将权限重置回其中的用户。
分辨率:
如果您从sudo npm -g
安装dpd或npm,或者以某种方式累积了一些权限问题,则此命令将修复权限,并使用对mongodb的引用开始部署(如果需要):
$ chown <youruser>:<yourgroup> ~/.npm -R
$ cd /lib/node_modules/deployd/bin
$ sudo chown root:yourGroup dpd
$ sudo chmod g+rwx dpd
$ dpd -d --mongod .dpd/pids/mongod
starting deployd v0.8.4...
deployd v0.8.5 is available.
如果您的运行是从Windows部署的,则必须以管理员身份运行命令提示符。
如果您有映射的网络驱动器,当您以管理员身份运行时,您将无法访问此映射的网络驱动器。在这一点上,最简单的解决方案就是通过DOS映射它,
c:/ #> net use x: \\hostname\\share
c:/ #> x:
x:/ #> cd ~/yourprojectdir/deploydSite
x:/yourprojectdir/deploydSite #> dpd -d
这个确切的设置可能不适合您,但它给了您一个想法,当您安装dpd as-g或使用sudo时,可以放宽权限。
预防;正确的npm包$path用法
我们什么时候,什么时候不在全球安装npm包?这取决于您的应用程序需求和经验水平。
有时我们需要全局安装npm包,即
sudo
将节点模块添加到/root/.node\u模块中,或添加到linux文件系统的上部目录中,以便在根许可/pwned$path(位于/usr/bin/node\u模块附近)上实现全局可用性。例如,一些全球性的时代;
1)当我们中的任何人想要在全局位置向我们的用户站点项目目录添加一个全局模块时,它将不需要部署或作为applications repo的一部分(仅在开发期间使用npm包)
2)或者当遇到许可问题时,就这么做,因为这是一种试图克服许可问题的尝试(通常不是一个好主意,我会加上,首先会让你陷入这个困境)
一些非环球时报也可能存在:
也就是说,当我们希望npm包不是全局安装时。
1)也许我们希望他们只对我们所有的用户开放项目,希望保持我们的应用程序干净,在运行我们的appd时会在~/.npm之外使用它们。见鬼,系统管理员甚至可能只允许我们这样做,以保护其他dev的全局空间。因此,例如:这意味着我们要安装npm包,而不是全局安装,这会将它们理想地放入我们的~/.npm/node_modules$path中,并且不使用
sudo npm -g
选项。2)或者我们可能希望将模块与我们的应用程序一起部署(通常是为了满足生产需要,以确保软件包在应用程序的保质期内都在那里),因此我们将它们安装在与我们的应用程序相同的目录中,以便它们可以成为repo的一部分,而repo又不使用
-g
选项。那么,我什么时候在全球安装npm包呢?这取决于应用程序的需求和要求,或者是开发需求,请参见上文。
-
整理所有需要的路径
安装后,需要确保所有路径都可用。你需要找到所有这些模块的位置。对于每个模块,查找它们,统计它们所驻留的所有目录,然后将其与路径交叉引用
-g
可能会有这样的结果
$ echo $PATH
$ which node
/usr/bin/node
$ which npm
/usr/bin/npm
$ which dpd
/usr/bin/node_modules/bin/bin/dpd
$ which less
/usr/bin/less
$ which uglifyjs
/usr/bin/uglifyjs
所以在这里我们需要确保我们的路径以某种方式精确地附加了以下内容
/usr/local/sbin:/usr/local/bin:/usr/bin/node_modules/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl
如您所见,因为这是我们的包箱/模块所在的位置,我们需要从应用程序或命令行中引用。
一种确保将这些添加到用户$path的方法是编辑bashrc文件。
-
根据发行版相应地编辑bashrc。
/usr/bin; /usr/bin/node_modules/bin/bin;
NODE_MODULES=/usr/bin/bode_modules/bin/bin:/usr/bin
export PATH=<someadditionalpath-maybe-any-currentexistingones>:$NODE_MODULES:$PATH
请注意,对于symfony/assetic用户,请确保更新assetic路径,同时更新上面的新发现。
与linux用户的新登录会话应该证明您在返回开发的路上表现良好。现在,您应该在路径上看到正确的路径项,然后当您以用户身份运行所有这些命令(例如
vim ~/.bashrc
或$ npm
)时,您应该不会看到错误,也不必在前面附加./例如$ dpd
或./dpd -d
等。dpd应该正确运行,您的应用程序,不管是assetic还是其他什么,现在都可以正确访问模块了。
关于node.js - Node 和/或npm问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31826689/