节点和/或 npm 问题
node and or npm issue
我遇到了一些 npm 包的各种权限和/或路径问题,这次是 deployd 的 dpd 二进制文件。然而,它似乎仍然与我不时收到的几乎所有其他令人沮丧的 npm 路径问题有关。考虑到我在安装 npm 包时经常使用 -g 而不是 -g,这似乎是 npm 用法的一个熟悉的面孔..
到目前为止,为了解决这个问题,我尝试从用户和全球范围内多次重新安装 deployd 和 mongodb,我什至重新安装了 npm。我在 运行ning dpd 时收到一致的包错误。我发现很多相关的,但 none 有效。这是我今天 运行ning dpd 时遇到的问题。有什么 g运行d 的建议吗?
当 运行 从 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
当 运行 来自 windows 在 samba 共享映射网络驱动器上时,我得到这个
dpd > fs: missing callback Error: EPERM, open 'C:\Program Files (x86)\Deployd\node_modules\deployd\.latestversion'
我做错了什么?
我找不到这个文件,也找不到这行代码,
child_process.js:1162
抛出 errnoException(错误,'spawn');
当我 grep 查找它时,确实出现了一个引用代码行,即 /bin/node,当我在 vim 中打开它时,它看起来是加密的...我想我再看一遍,然后线路可能在那里...嗯。
好的,我确实在节点二进制文件中找到了那一行,
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,当 运行 作为用户时也是如此......没有安装 selinux,可能有一些 facls......怀疑它,在这个目录中..
我重新安装了 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
注意EACCESS
,这意味着它是一个权限问题。 dpd 的权限需要正确访问 运行。检查 dpd
二进制文件的权限,这是 EACCESS
错误的潜在原因。可能因为 sudo npm -g
是 运行 和 sudo 一样,catch 22 可能变成了因为 运行 和 sudo 一样,权限没有设置在 dpd 链上的某个地方,甚至可能是符号链接本身,所以您需要手动转到 /usr/bin/node_modules/bin/bin/pdp 到 /lib/node_modules/deployd/bin 中的二进制符号链接并重置其中的权限。
然而,更深入地思考,问题可能是由于 dpd 安装本身作为来自 sudo 的 运行,因为 npm 可能已经为此逻辑链添加了一个很好的错误输出。
此外,需要检查 linux 用户目录中 .npm 的权限,有些事情可能已经以 root 身份完成,或者在那里进行 sudo。您可能希望递归地将权限重置回您的用户。
分辨率:
如果您从 sudo
安装 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.
如果您的 运行ning 是从 windows 部署的,您必须 运行 cmd 提示符作为管理员。
如果您有映射的网络驱动器,当您 运行 作为管理员时,您将无法访问此映射的网络驱动器。那时最简单的解决方案就是通过 DOS 映射它,
c:/ #> net use x: \hostname\share
c:/ #> x:
x:/ #> cd ~/yourprojectdir/deploydSite
x:/yourprojectdir/deploydSite #> dpd -d
那个确切的设置可能并不完全适合你,但它给了你一个想法,当你安装 dpd 作为 -g 或使用 sudo 时完全放松权限。
预防;正确的 npm 包 $PATH 用法
我们什么时候全局安装 npm 包,什么时候不全局安装?这取决于您的应用需求和经验水平。
有时我们需要全局安装 npm 包,即 sudo npm -g
将节点模块添加到 /root/.node_modules 或 [=90= 的上层目录中] 根 permissed/pwned $PATH 上的全局可用性文件系统,它位于 /usr/bin/node_modules 附近。
一些全球时间可以是例如;
1) 当我们中的任何人想要在全球位置向我们的用户站点项目目录添加全局模块时,该模块不需要部署或作为应用程序存储库的一部分(npm 包仅在开发期间使用)
2) 或者什么时候遇到权限问题,只是因为它试图一举解决权限问题(通常不是一个好主意,我会首先解决这个问题)
一些非全球时间也可以存在:
即当我们希望 npm 包不是全局安装时。
1) 也许我们希望它们只对我们所有的用户项目可用,想要保持我们的应用程序干净,在 运行 连接我们的 appd 时会在 ~/.npm 之外使用它们。哎呀,系统管理员甚至可能只允许我们这样做,以保护其他开发者的全局 space。例如:这意味着我们想要安装 npm 包而不是全局,理想情况下将它们放入我们的 ~/.npm/node_modules $PATH,并且不使用 -g
选项。
2) 或者也许我们想用我们的应用程序部署模块(通常是为了生产需要,以确保包在您的应用程序的保质期内存在),所以我们将它们安装在同一目录中作为我们的应用程序,以便它们可以成为存储库的一部分,它再次不使用 -g
选项。
那么,我什么时候全局安装 npm 包?这取决于您的应用程序的需求和要求,或开发需求,请参见上文。
-
计算任何需要的路径
安装后,您需要确保所有路径都可用。您将需要找到所有这些模块所在的位置。对于每个模块,查找它们,统计它们所在的所有目录,然后将其与您的路径交叉引用
$ echo $PATH
它可能 return 像这样
/usr/local/sbin:/usr/local/bin:/usr/bin/node_modules/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl
$ 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/bin; /usr/bin/node_modules/bin/bin;
如您所见,因为这是我们的包 bins/modules 所在的位置,我们需要从我们的应用程序或命令行引用它。
确保将这些添加到用户 $PATH 的一种方法是编辑 bashrc 文件。
-
根据你的发行版相应地编辑你的 bashrc ..
vim ~/.bashrc
NODE_MODULES=/usr/bin/bode_modules/bin/bin:/usr/bin
export PATH=<someadditionalpath-maybe-any-currentexistingones>:$NODE_MODULES:$PATH
请注意 symfony / assetic 用户,请确保您也将 assetic 路径更新为上面的新发现..
与 linux 用户的新登录会话应该证明您在返回开发的路上做得很好。您现在应该在您的路径上看到正确的路径项,然后当您 运行 所有这些命令作为您的用户时,例如$ npm
或 $ dpd
,您应该看不到任何错误,并且不必在前面附加 ./ 例如./dpd -d
或 ./npm
等。Dpd 应该 运行 正确,并且您的应用程序,无论是资产还是任何东西,现在都可以正确访问模块。
我遇到了一些 npm 包的各种权限和/或路径问题,这次是 deployd 的 dpd 二进制文件。然而,它似乎仍然与我不时收到的几乎所有其他令人沮丧的 npm 路径问题有关。考虑到我在安装 npm 包时经常使用 -g 而不是 -g,这似乎是 npm 用法的一个熟悉的面孔..
到目前为止,为了解决这个问题,我尝试从用户和全球范围内多次重新安装 deployd 和 mongodb,我什至重新安装了 npm。我在 运行ning dpd 时收到一致的包错误。我发现很多相关的,但 none 有效。这是我今天 运行ning dpd 时遇到的问题。有什么 g运行d 的建议吗?
当 运行 从 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
当 运行 来自 windows 在 samba 共享映射网络驱动器上时,我得到这个
dpd > fs: missing callback Error: EPERM, open 'C:\Program Files (x86)\Deployd\node_modules\deployd\.latestversion'
我做错了什么?
我找不到这个文件,也找不到这行代码, child_process.js:1162 抛出 errnoException(错误,'spawn'); 当我 grep 查找它时,确实出现了一个引用代码行,即 /bin/node,当我在 vim 中打开它时,它看起来是加密的...我想我再看一遍,然后线路可能在那里...嗯。
好的,我确实在节点二进制文件中找到了那一行,
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,当 运行 作为用户时也是如此......没有安装 selinux,可能有一些 facls......怀疑它,在这个目录中..
我重新安装了 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
注意EACCESS
,这意味着它是一个权限问题。 dpd 的权限需要正确访问 运行。检查 dpd
二进制文件的权限,这是 EACCESS
错误的潜在原因。可能因为 sudo npm -g
是 运行 和 sudo 一样,catch 22 可能变成了因为 运行 和 sudo 一样,权限没有设置在 dpd 链上的某个地方,甚至可能是符号链接本身,所以您需要手动转到 /usr/bin/node_modules/bin/bin/pdp 到 /lib/node_modules/deployd/bin 中的二进制符号链接并重置其中的权限。
然而,更深入地思考,问题可能是由于 dpd 安装本身作为来自 sudo 的 运行,因为 npm 可能已经为此逻辑链添加了一个很好的错误输出。
此外,需要检查 linux 用户目录中 .npm 的权限,有些事情可能已经以 root 身份完成,或者在那里进行 sudo。您可能希望递归地将权限重置回您的用户。
分辨率:
如果您从 sudo
安装 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.
如果您的 运行ning 是从 windows 部署的,您必须 运行 cmd 提示符作为管理员。
如果您有映射的网络驱动器,当您 运行 作为管理员时,您将无法访问此映射的网络驱动器。那时最简单的解决方案就是通过 DOS 映射它,
c:/ #> net use x: \hostname\share
c:/ #> x:
x:/ #> cd ~/yourprojectdir/deploydSite
x:/yourprojectdir/deploydSite #> dpd -d
那个确切的设置可能并不完全适合你,但它给了你一个想法,当你安装 dpd 作为 -g 或使用 sudo 时完全放松权限。
预防;正确的 npm 包 $PATH 用法
我们什么时候全局安装 npm 包,什么时候不全局安装?这取决于您的应用需求和经验水平。
有时我们需要全局安装 npm 包,即 sudo npm -g
将节点模块添加到 /root/.node_modules 或 [=90= 的上层目录中] 根 permissed/pwned $PATH 上的全局可用性文件系统,它位于 /usr/bin/node_modules 附近。
一些全球时间可以是例如;
1) 当我们中的任何人想要在全球位置向我们的用户站点项目目录添加全局模块时,该模块不需要部署或作为应用程序存储库的一部分(npm 包仅在开发期间使用)
2) 或者什么时候遇到权限问题,只是因为它试图一举解决权限问题(通常不是一个好主意,我会首先解决这个问题)
一些非全球时间也可以存在: 即当我们希望 npm 包不是全局安装时。
1) 也许我们希望它们只对我们所有的用户项目可用,想要保持我们的应用程序干净,在 运行 连接我们的 appd 时会在 ~/.npm 之外使用它们。哎呀,系统管理员甚至可能只允许我们这样做,以保护其他开发者的全局 space。例如:这意味着我们想要安装 npm 包而不是全局,理想情况下将它们放入我们的 ~/.npm/node_modules $PATH,并且不使用 -g
选项。
2) 或者也许我们想用我们的应用程序部署模块(通常是为了生产需要,以确保包在您的应用程序的保质期内存在),所以我们将它们安装在同一目录中作为我们的应用程序,以便它们可以成为存储库的一部分,它再次不使用 -g
选项。
那么,我什么时候全局安装 npm 包?这取决于您的应用程序的需求和要求,或开发需求,请参见上文。
- 计算任何需要的路径 安装后,您需要确保所有路径都可用。您将需要找到所有这些模块所在的位置。对于每个模块,查找它们,统计它们所在的所有目录,然后将其与您的路径交叉引用
$ echo $PATH
它可能 return 像这样
/usr/local/sbin:/usr/local/bin:/usr/bin/node_modules/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl
$ 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/bin; /usr/bin/node_modules/bin/bin;
如您所见,因为这是我们的包 bins/modules 所在的位置,我们需要从我们的应用程序或命令行引用它。
确保将这些添加到用户 $PATH 的一种方法是编辑 bashrc 文件。
-
根据你的发行版相应地编辑你的 bashrc ..
vim ~/.bashrc
NODE_MODULES=/usr/bin/bode_modules/bin/bin:/usr/bin
export PATH=<someadditionalpath-maybe-any-currentexistingones>:$NODE_MODULES:$PATH
请注意 symfony / assetic 用户,请确保您也将 assetic 路径更新为上面的新发现..
与 linux 用户的新登录会话应该证明您在返回开发的路上做得很好。您现在应该在您的路径上看到正确的路径项,然后当您 运行 所有这些命令作为您的用户时,例如$ npm
或 $ dpd
,您应该看不到任何错误,并且不必在前面附加 ./ 例如./dpd -d
或 ./npm
等。Dpd 应该 运行 正确,并且您的应用程序,无论是资产还是任何东西,现在都可以正确访问模块。