忍者:一种简单的构建方式

2020-10-27 23:06:06

你好!。每隔一段时间我就会发现一款我真的很喜欢的新软件,今天我想谈谈我最近最喜欢的一款软件:忍者!

我做了很多想要设置增量构建的小项目-例如,现在我正在写一篇关于bash的杂志,并且我为该杂志的每一页都有一个.svg文件。我需要将SVG转换为PDF,我会将其转换为如下内容:

对于*.svgdo svg2pdf$I$i.pdf#或${i/.svg/.pdf}中的I,如果您想真正完成。

这很好用,但是我的svg2pdf脚本有点慢(它使用Inkscape),当我刚刚更新了1个页面时,不得不等待90秒或其他什么东西才能重新构建所有的PDF,这是很烦人的。

过去,在我的小项目中使用Make或Bazel这样的构建系统会让我相当反感,因为Bazel是一个很大、很复杂的东西,Make对我来说有点神秘。我真的不知道怎么用它们中的任何一个。

因此,很长一段时间以来,我只是为我的建筑写了一个狂欢脚本或其他东西,并听天由命,有时只是等待一分钟。

但是忍者并不复杂!以下是我所知道的关于忍者构建文件语法的所有内容:如何创建规则和构建:

规则有一个命令和描述(描述只是供人类阅读,这样您就可以在构建代码时知道它在做什么)

构建的语法是build output_file:Rule_name input_files。这里有一个使用svg2pdf规则的例子。规则中的输出为in$out,输入为$in。

就这样!。如果您将这两个内容放入名为build.ninja的文件中,然后运行ninja,则ninja将运行Inkscape variables.svg--export-text-to-path--export-pdf=pdfs/variables.pdf。如果您再次运行它,它将不会运行任何内容(因为它可以告诉您已经构建了pdfs/variables.pdf,并且您是最新的)。

忍者还有一些比这更多的功能(参见手册),但我还没有用过它们。它最初是为Chromium构建的,所以即使功能集很小,它也可以支持大型构建。

忍者的神奇之处在于,不需要使用一些令人困惑的BuildLanguage,因为你很少使用它(就像Make一样),所以很难记住它,相反,忍者语言超级简单,如果你想做一些复杂的事情,那么你只需使用你想要的任何编程语言生成你想要的构建文件。

我喜欢创建一个build.py文件,或者类似这样的文件,它创建忍者构建文件,然后运行忍者:

将open(';build.ninja';,';w";)作为ninja_file:#写入一些规则ninsa_file.write(";";";";Rule svg2pdf command=Inkscape$in--export-text-to-path--export-pdf=$out description=svg2pdf$in$out";";";";)#对于我需要为Things_to_Convert中的文件名构建的每个文件,使用一些for循环:ninsa_file.write(f";";";";Build{filename.place(';svg';,';pdf';)}:svg2pdf{filename}";";";)#运行忍者端口subprocesssubprocess.check_call([';ninja';])。

我相信有很多忍者的最佳实践,但是我不知道,对于我的小项目来说,我发现这个方法效果很好。

我还不太了解介子,但是最近我在构建一个C程序(plocate,一种更快的定位方法),我注意到与通常的./configure;make;make install不同,有不同的构建说明:

似乎Meson是一个C/C++/Java/Rust/Fortran的构建系统,可以使用JINJA作为后端。

我已经用忍者几个月了。我真的很喜欢它,它给我带来了大约0个与构建相关的头痛,这对我来说感觉相当神奇。