节点包 - 在package.json中是否可以插入变量?

7

我有一个静态网站,使用 node-sass 编译 Sass。

目前我正在使用 Grunt 监听文件,但我感觉这太过繁琐,因为我可以使用它们内置的 CLI。

所以我在我的 package.json 文件中添加了以下内容:

// package.json
...
"scripts": {
  "sass": "node-sass -w input/dir -o output-dir/" 
}
问题是,我需要在 --include-pathrequire 一个全局安装的Sass框架模块。我可以在Gruntfile中完成这个操作:
// Gruntfile.js
sass: {
  options: {
    includePaths: require("the-framework").includePaths()
  },
  ...
},
所以,我想到的第一件事是像这样插值字符串:
// package.json
...
"scripts": {
  "sass": "node-sass -w input/dir -o output-dir/ --include-path " + require("the-framework").includePaths()
}

正如预期的那样,它不起作用。尽管脚本运行了,但是插值变量被忽略了。

是否有解决方案或替代方案?如果可能的话,我希望不需要创建额外的文件来存储变量。

谢谢


SO(Stack Overflow)的编辑规定是回答必须发布为“回答”,而不是问题的编辑。请将您的回答发布为实际的回答。谢谢。 - Louis
3个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
7

我不确定这是否是正确的方法,但我可以解释一下我如何解决这个任务。

你不能在package.json中插入变量,因为它必须是有效的json。你可以在这里编写bash命令。

1)你可以编写一个node命令来获得所需的结果。你需要注意includePaths()是否返回字符串。

Node options:
  -e, --eval script     evaluate script
  -p, --print           evaluate script and print result
所以它会像这样:
node -e "console.log(require('the-framework').includePaths())"

或者使用--print的简短版本

node -p "require('the-framework').includePaths()"

2) 将先前命令的内联输出嵌入到Sass脚本中。注意正确转义。

{
  "scripts": {
      "sass": "node-sass -w input/dir -o output-dir/ --include-path $(node -p \"require('the-framework').includePaths()\")"
  }
}

关于执行Bash命令的更多信息,您可以在这里找到。

P.S. Windows版本有所不同。

{
  "scripts": {
      "sass": "FOR /f \"delims=\" %v IN ('node -p \"require('edje').includePaths()[0]\"') DO node-sass -w assets/sass -o assets/css --include-path \"%v\""
  }
}

你可以在这里找到更多相关信息。


谢谢回复。我认为 $(...) 存在错误。我尝试在控制台中输入 node -p ...,它成功地打印了路径。但是在 $(...) 中它不起作用。 - hrsetyono
我无法检查它,因为我没有运行的示例,但我尝试使用命令“ls - $(node -p”'la'“)”,它与“ls -la”完全相同。 - Alexey B.
不是这样的,我得到了 ls: invalid option -- $。我在 Windows 10 上,也许这就是原因? - hrsetyono
哎呀,我想Windows版本可能会有所不同。我一直在Windows上使用Cygwin。 - Alexey B.
我在 Mac 上尝试了 ls -$(...),它可以工作。但我仍然需要为 Windows 编写可行的代码。 - hrsetyono
没问题,这是我的最终代码,你可以编辑你的答案,我会接受它:FOR /f \"delims=\" %v IN ('node -p \"require('edje').includePaths()[0]\"') DO node-sass -w assets/sass -o assets/css --include-path \"%v\" - hrsetyono

0
你可以像这样做:
“scripts”: {
  “sass”: “node-sass --include-path scss scss/main.scss   public/css/main.css”
},

该框架是一个npm模块,位于node安装目录中,而不是项目内部。我可以使用require获取路径,但是package.json不允许字符串插值。 - hrsetyono

0

有许多方法可以使用npm脚本来解决这个问题。

我首先想到的是,通过查看您的具体需求,npm在调用脚本时接受额外的参数。例如:

npm run sass -- path/to/the-framework

这将解析为:

node-sass -w input/dir -o output-dir/ --include-path path/to/the-framework

另一种方法是将您的代码移动到一个 .js 可执行文件(Node)中,我们称之为 watch-sass.js。 因此,您的脚本将如下所示:
"sass": "node watch-sass.js"

然后你会运行:

npm run sass

这样你就有更多的自由在文件中做任何你想做的事情。


可能性真的是无限的,如果你想的话,你可以利用 bash 脚本的强大功能而不是 JS,它们都可以读/写环境变量。但你并不一定需要它们。例如,你可以只编写一个 shell 脚本为你编写一个 package.json 文件(或者 Python、Ruby...),其中所有的变量已经就位。但最终我认为这只是个人口味问题,使用你觉得更简单或更舒适的工具即可。

您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - hrsetyono
@DarcCode,你尝试过第一种方法吗?我认为这可能是你正在寻找的东西。 - Simone
我不想每次运行脚本时都要输入 C:/ProgramFiles/.../...。而且安装目录在不同的计算机上可能是不同的,所以我需要使用 require... - hrsetyono
如何传递相对路径?而且它不是硬编码的,所以在另一台计算机上,用户将键入不同的路径。 - Simone

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,