如何在全局安装时从脚本获取我的 npm 存储库的路径



对于我的项目,我在github上创建了一个包含一些项目相关工具的git。git 包含一个package.json和一些映射到bin指令的二进制文件。 虽然是私有存储库并且未发布到任何实际的 NPM 存储库服务器,但它可以使用

$ npm install -g git+ssh://git@github.com:<path to my tool git>

大多数工具对模块中的其他文件没有任何依赖关系,并且它们工作得很好。但是其中一个工具是用于启动本地 DynamoDB 服务器的包装器,我的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>

这似乎真的没有意义。当然,有一种简单的方法可以从全局安装为二进制文件的脚本中引用模块中的其他脚本或文件?我已经打印了所有环境变量等,寻找包含模块路径的东西,但没有运气。

我提出了一个稍微好一点的解决方案,使用dirnamereadlink的组合:

SCRIPT_PATH=$(dirname $(dirname $0)/$(readlink $0))

这使用了一个事实,即全局安装的 npm 模块作为从$NODE_PATH/bin/<script>../lib/node_modules/<npm-module>/<script>的符号链接安装。

它可能不是在所有环境中都是 100% 健壮的,它仍然感觉应该有一种更简单的方法,但它有效。

最新更新