如何编写一个返回单行“node”脚本结果的函数?

如何编写一个返回单行“node”脚本结果的函数?

我正在尝试编写一个非常简单的bash函数,它使用一行node脚本从 JSON 文件中读取键的值。以下是当前的内容utils.bash

#!/bin/bash

project_name() {
    echo $(node -e "require('../package.json').name;")
}

是的,我知道有一些工具可以让我更直接地访问 JSON 数据,但所有开发团队都已经有了node,所以它是一个现有的依赖项,而不是一个新的依赖项。

我已使该文件可执行,但是当我source scripts/utils.bash尝试(从命令行)引用该函数时,如下所示:

PROJECT_NAME=project_name

输出只是我输入的行。当我尝试简单地执行时project_name,出现node错误:

Error: Cannot find module '../package.json'

utils.bash脚本位于项目的scripts文件夹中,package.json文件位于父文件夹中。我从父文件夹执行此操作(尽管我希望这无关紧要)。我尝试过 import './package.json',但这也给了我一个错误。

我想要的最终结果是能够通过多个脚本引用name键的值。project.jsonbash

我怎样才能做到这一点?

答案1

嗯,问题PROJECT_NAME=project_name是它应该是PROJECT_NAME="$(project_name)"。在这种情况下,引号不是必需的,因为它是在对 a 的赋值中标量变量,但这是一个好习惯,就像在许多其他情况下一样(包括您的echo $(...)),省略引号意味着将结果拆分为$IFS字符并对结果单词执行通配(这是您不想要的)。

该函数具有与其运行位置相同的工作目录,并且您说您在scripts.所以该函数正在寻找./../package.jsonnot ./scripts/../package.json

因此,您可能想要使用./package.json(不像package.json路径没有 no 时那样/node在默认搜索路径而不是当前工作目录中查找)并找出为什么它会给您一个错误。

您还需要node使用console.log(), 和输出该值删除没有意义的echo内容$(...)(特别是$(...)如上所示未引用的内容)。所以:

package_name() {
  node -e "console.log(require('./package.json').name)"
}
PACKAGE_NAME="$(package_name)" || handle error from node if any

相关内容