如何将文本作为 npm 脚本命令添加到文件中

Posted

技术标签:

【中文标题】如何将文本作为 npm 脚本命令添加到文件中【英文标题】:How to prepend text to a file as an npm script command 【发布时间】:2019-08-20 09:14:04 【问题描述】:

我正在写一个书签。我需要将 "javascript:" 添加到已编译、缩小的 JavaScript 中。我正在寻找一种使用 NPM package.json 脚本来完成此任务的方法。

 
    "scripts": 
        "oar:transpile-typescript": "tsc --target es6  --lib dom,es6 ./OarBookmarklet/Oar.ts",
        "oar:minify-javascript": "jsmin -o ./OarBookmarklet/oar.min.js ./OarBookmarklet/oar.js",
        "oar:prepend-javascript": "[??? prepend `javascript:` to minified JavaScript ???]",
        "oar": "run-s oar:transpile-typescript oar:minify-javascript oar:prepend-javascript",
        "build": "run-s oar"
    

【问题讨论】:

【参考方案1】:

如果这是在类似 Unix 的东西上运行,那么:

(printf 'javascript:' ; cat ./OarBookmarklet/oar.min.js) > ./OarBookmarklet/oar.bm.min.js

应该做的工作。


根据 OP 的评论进行编辑

我的执行环境是Windows,...

在这种情况下,您应该可以使用:

(set /p junk="javascript:" <nul & type ./OarBookmarklet/oar.min.js) > ./OarBookmarklet/oar.bm.min.js

set /p ... &lt;nul 怪异是一种在不附加换行符的情况下将一些文本发送到标准输出的方法。

【讨论】:

我的执行环境是Windows、VS Code、PowerShell控制台。 我必须在路径中使用双反斜杠:"(set /p junk=\"javascript:\" &lt;nul &amp; type .\\OarBookmarklet\\oar.min.js) &gt; .\\OarBookmarklet\\oar.bm.min.js" 是否可以将文本添加到原始oar.min.js 而无需创建另一个文件,即oar.bm.min.js【参考方案2】:

对于跨平台解决方案,请使用 node.js,它是内置的 fs.readFileSync(...)fs.writeFileSync(...)。这样,您的 npm 脚本在哪个 shell 中运行都没有关系(shcmd.exebashbash.exepwsh...

要实现这一点,请考虑以下两种解决方案中的任何一种 - 它们本质上是相同的,只是应用方法不同。


解决方案 A. 使用单独的 node.js 脚本

创建以下脚本,我们将其保存为prepend.js在项目目录的根目录下,即与package.json所在的同一级别。

prepend.js

const fs = require('fs');
const filepath = './OarBookmarklet/oar.min.js';
const data = fs.readFileSync(filepath);
fs.writeFileSync(filepath, 'javascript:' + data);

package.json

package.json中定义oar:prepend-javascriptnpm脚本如下::

"scripts": 
  ...
  "oar:prepend-javascript": "node prepend",
  ...
,

注意: 以上 node.js 调用脚本并执行所需的任务。如果您选择将 prepend.js 保存在与上述目录不同的目录中,请确保定义正确的路径,即"oar:prepend-javascript": "node ./some/other/path/to/prepend.js"


方案 B. 在 package.json 中内联 node.js 脚本

或者,您可以在 npm 脚本中内联 prepend.js 的内容,从而避免使用单独的 .js 文件。

package.json

package.json中定义oar:prepend-javascript脚本如下:

"scripts": 
  ...
  "oar:prepend-javascript": "node -e \"const fs = require('fs'); const fp = './OarBookmarklet/oar.min.js'; const d = fs.readFileSync(fp); fs.writeFileSync(fp, 'javascript:' + d);\""
  ...
,

注意:这里使用nodejs命令行选项-e来评估内联JavaScript。

【讨论】:

以上是关于如何将文本作为 npm 脚本命令添加到文件中的主要内容,如果未能解决你的问题,请参考以下文章

如何使用Argument将路径文件作为输入数据获取到PowerShell中的其他脚本?

如何在 npm 包中添加文件夹作为条目?

如何通过 postinstall npm 脚本自动将文件从包复制到本地目录?

如何使用 pdfminer 作为库

如何将打字稿定义文件添加到 npm 包中?

如何为我的App Engine应用设置自定义npm启动脚本?