对于我的项目,我在github上创建了一个包含一些项目相关工具的git。 git包含package.json
和一些映射到bin
指令的二进制文件。
虽然是私人仓库并且未发布到任何实际的NPM仓库服务器,但可以使用
$ npm install -g git+ssh://git@github.com:<path to my tool git>
大多数工具与模块中的其他文件没有任何依赖关系,它们工作得很好。但其中一个工具是启动local DynamoDB server的包装器,我的package.json
包含这样的部分:
"bin": {
"ddb-local": "db/ddb_local.sh"
}
我的db/db_local.sh
文件包含启动DynamoDB的java命令:
#/bin/bash
java -Djava.library.path=DynamoDB/DynamoDBLocal_lib -jar DynamoDB/DynamoDBLocal.jar -inMemory
DynamoDB
文件夹位于db
文件夹中,该文件夹位于我的模块的根目录中:
<module root>
|
|- db
|- DynamoDB
|- DynamoDBLocal.jar
|- DynamoDBLocal_lib
| ddb_local.sh
|- package.json
安装后,ddb-local
从我的节点bin
文件夹链接,可以从任何地方调用,但ddb_local.sh
脚本将失败(除非<path to my module>/db
文件夹发生是我当前的目录),因为它试图找到相对于脚本的文件,在我使用NVM的情况下,脚本将从~/.nvm/versions/node/v4.6.1/bin/
现在,如果这是一个节点脚本,我可以轻松地在我自己的模块中require
个文件,但由于它是一个bash脚本,我不知道最好的方法是生成一个有效的路径到我的模块目录中的文件。
我知道我的软件包安装在~/.nvm/versions/node/v4.6.1/lib/node_modules/<my module>
下,而我可以使用
`dirname "$0"`/../lib/node_modules/<module name>
这似乎没有意义。当然有一种简单的方法可以从作为二进制文件全局安装的脚本中引用模块中的其他脚本或文件?我打印了所有环境变量等,寻找包含模块路径的东西,但没有运气。
答案 0 :(得分:0)
我使用dirname
和readlink
的组合提出了更好的解决方案:
SCRIPT_PATH=$(dirname $(dirname $0)/$(readlink $0))
这使用全局安装的npm模块作为从$NODE_PATH/bin/<script>
到../lib/node_modules/<npm-module>/<script>
的符号链接安装的事实。
在所有环境中它可能不是100%强大,它仍然感觉应该有一个更简单的方法,但它的工作原理。