如何将文本作为 npm 脚本命令添加到文件中
How to prepend text to a file as an npm script command
我正在写一个小书签。我需要将 "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"
}
}
如果这是 运行 在类 Unix 上,那么:
(printf 'javascript:' ; cat ./OarBookmarklet/oar.min.js) > ./OarBookmarklet/oar.bm.min.js
应该完成这项工作。
根据 OP 的评论进行编辑:
My execution environment is Windows, ...
在这种情况下,您应该可以使用:
(set /p junk="javascript:" <nul & type ./OarBookmarklet/oar.min.js) > ./OarBookmarklet/oar.bm.min.js
set /p ... <nul
奇怪的是一种将一些文本发送到 stdout 而没有附加换行符的方法。
对于跨平台解决方案,使用 node.js 并且它是内置的 fs.readFileSync(...)
and fs.writeFileSync(...)
。这样,您的 npm 脚本在 shell 中运行并不重要(sh
、cmd.exe
、bash
、bash.exe
、pwsh
、...
)
要实现这一点,请考虑以下两种解决方案之一 - 它们本质上相同,只是应用方法不同。
解决方案 A. 使用单独的 node.js 脚本
创建以下脚本,让我们将其另存为prepend.js在项目目录的根目录下,即与[所在的同一级别=85=]居.
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-javascript
npm脚本如下::
"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.
我正在写一个小书签。我需要将 "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"
}
}
如果这是 运行 在类 Unix 上,那么:
(printf 'javascript:' ; cat ./OarBookmarklet/oar.min.js) > ./OarBookmarklet/oar.bm.min.js
应该完成这项工作。
根据 OP 的评论进行编辑:
My execution environment is Windows, ...
在这种情况下,您应该可以使用:
(set /p junk="javascript:" <nul & type ./OarBookmarklet/oar.min.js) > ./OarBookmarklet/oar.bm.min.js
set /p ... <nul
奇怪的是一种将一些文本发送到 stdout 而没有附加换行符的方法。
对于跨平台解决方案,使用 node.js 并且它是内置的 fs.readFileSync(...)
and fs.writeFileSync(...)
。这样,您的 npm 脚本在 shell 中运行并不重要(sh
、cmd.exe
、bash
、bash.exe
、pwsh
、...
)
要实现这一点,请考虑以下两种解决方案之一 - 它们本质上相同,只是应用方法不同。
解决方案 A. 使用单独的 node.js 脚本
创建以下脚本,让我们将其另存为prepend.js在项目目录的根目录下,即与[所在的同一级别=85=]居.
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-javascript
npm脚本如下::
"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.