当前位置: 首页 > 科技观察

忍者:简单的搭建方法

时间:2023-03-20 15:11:49 科技观察

大家好!每隔一段时间,我就会发现一款自己非常喜欢的新软件,而今天我想说说我最近喜欢的一款软件:ninja!增量构建很有用我做了很多我想设置增量构建的小项目。例如,现在我正在写一本关于bash的杂志,杂志的每一页都有一个.svg文件。我需要将SVG转换为PDF,我是这样做的:foriin*.svgdosvg2pdf$i$i.pdf#or${i/.svg/.pdf}如果你真的想得到fancydone这是很好的作品,但我的svg2pdf脚本有点慢(它使用Inkscape),而且当我刚刚更新一页时不得不等待90秒或什么来重建所有PDF很烦人。构建系统令人困惑过去,我一直反对在我的小项目中使用像make或bazel这样的构建系统,因为bazel是一个大而复杂的东西,而make对我来说有点神秘。我真的不想使用它们中的任何一个。所以很长一段时间,我只是写了一个bash脚本或其他东西来做构建,然后我就听天由命了,有时只是等一分钟。ninja是一个极其简单的构建系统,但ninja并不复杂!以下是我对忍者构建文件的语法的了解:创建一个规则,一个build:rule有一个命令和一个描述参数(描述只是人为的,所以你知道它正在构建你在编码时所做的事情)。rulesvg2pdfcommand=inkscape$in--export-text-to-path--export-pdf=$outdescription=svg2pdf$in$outbuild的语法是buildoutput_file:rule_nameinput_files。下面是一个使用svg2pdf规则的例子。输出在规则中的$out中,输入在$in中。构建pdfs/variables.pdf:svg2pdfvariables.svg就是这样!如果将这两个东西放在一个名为build.ninja的文件中,然后运行??ninja,ninja将运行inkscapevariables.svg--export-text-to-path--export-pdf=pdfs/variables.pdf。然后如果你再次运行它,它不会运行任何东西(因为它可以告诉你pdfs/variables.pdf已经构建,并且是最新的)。Ninja还有一些功能(见手册),但我还没有使用过它们。它最初是为Chromium构建的,因此即使功能集很小,它也可以支持大型构建。ninja文件通常是自动生成的ninja的神奇之处在于你不必使用一些混乱的构建语言,它们很难记住,因为你不经常使用它(比如make),相反,ninja语言非常棒很简单,如果你想做一些复杂的事情,那么你只需用任何编程语言生成你想要的构建文件。我喜欢编写一个build.py文件或类似的文件来创建ninja构建文件,然后运行??ninja:withopen('build.ninja','w')asninja_file:#writesomerulesninja_file.write("""rulesvg2pdfcommand=inkscape$in--export-text-to-path--export-pdf=$outdescription=svg2pdf$in$out""")#对每个我需要构建的文件进行循环things_to_convert中的文件名:ninja_file.write(f"""build{filename.replace('svg','pdf')}:svg2pdf{filename}""")#runninjaimportsubprocesssubprocess.check_call(['ninja'])我相信忍者有很多最佳实践,但我不知道它们。对于我的小项目,我发现它工作正常。meson是一个生成ninja文件的构建系统我对Meson了解不多,但最近当我构建一个C程序时(plocate,一种更快的locate替代方法),我注意到它有不同的构建指令,而不是通常的。/配置;制作;makeinstall:mesonbuilddircdbuilddirninja看起来Meson是一个可以使用ninja作为后端的C/C++/Java/Rust/Fortran构建系统。就是这样!我已经使用忍者几个月了。我真的很喜欢它,它很少让我头疼,这让我感觉很神奇。