免责声明:我是Jsonix和Jsonix Schema Compiler的作者,我试图弄清楚将Jsonix Schema Compiler集成到NPM package.json
中的规范方法。jsonix-schema-compiler
NPM软件包提供了用于代码生成的基于Java的工具。如果jsonix-schema-compiler
作为依赖项安装,则可以用来生成XML JS映射。调用类似于:
java -jar node_modules/jsonix-schema-compiler/lib/jsonix-schema-compiler-full.jar
schema.xsd
这样会生成一个
Mappings.js
之类的JavaScript文件,该文件基本上是模块代码的一部分。理想情况下,应该在模块构建期间执行上面的
jsonix-schema-compiler
调用(java -jar ...
等)。但是必须在安装模块依赖项之后执行它(否则将缺少node_modules/jsonix-schema-compiler
)。我的问题是-我应该在哪里规范配置NPM软件包中的代码生成?
现在,我正在
postinstall
脚本中执行此操作,例如:{
...
"dependencies": {
"jsonix": "x.x.x",
"jsonix-schema-compiler": "x.x.x"
},
"devDependencies" : {
"nodeunit" : "~0.8.6"
},
"scripts": {
"postinstall" : "java -jar node_modules/jsonix-schema-compiler/lib/jsonix-schema-compiler-full.jar schema.xsd",
"test": "nodeunit src/test/javascript/tests.js"
}
}
但是,已阅读this:
tl; dr不要使用install。使用.gyp文件进行编译,然后
预发布其他任何内容。
您几乎永远不必显式设置预安装或安装
脚本。如果您这样做,请考虑是否还有其他
选项。
如果
postinstall
也可以,我现在感到困惑。我要做的就是能够在安装依赖项之后但在执行其他操作(例如测试或发布)之前执行某个命令行命令。我应该如何规范地做?
最佳答案
通常,人们正在运行诸如coffeescript-to-javascript编译器,Ecmascript 6-> 5编译器和缩小器之类的事情,这是听起来很像您正在做的事情。
在发布前和安装后执行之间的区别在于,预发布脚本可能要在您签出的目录中运行,因此可以合理地假设java
可用并且各种开发依赖项都可用。而安装后脚本将在每次安装后运行,并且在java(etc.)不可用的情况下将失败,例如在简约的docker映像上。因此,您应该将构建步骤放入预发布或类似的脚本中。
我个人想做的是在package.json中定义一个脚本“ mypublish”,以确保所有测试都通过,运行构建,确保存在构建工件,然后运行npm publish
。我发现它比prepublish
更直观,它被用作“我将要发布”的钩子,而不是“在发布之前进行构建”。
这是一个使用以下设置的package.json:https://github.com/reid/node-jslint/blob/master/package.json,这是带有prepublish
目标的Makefile:https://github.com/reid/node-jslint/blob/master/Makefile
如果您还有其他问题,请告诉我;我有点无聊,因为有很多合法的方法可以完成它-只要避免使用postinstall
脚本即可。 ;-)