ninja:一个简单的构建方式
创始人
2024-03-02 06:02:26
0

大家好!每隔一段时间,我就会发现一款我非常喜欢的新软件,今天我想说说我最近喜欢的一款软件:ninja

增量构建很有用

我做了很多小项目,在这些项目中,我想设置增量构建。例如,现在我正在写一本关于 bash 的杂志,杂志的每一页都有一个 .svg文件。我需要将 SVG 转换为 PDF,我的做法是这样的:

for i in *.svg
do
    svg2pdf $i $i.pdf # or ${i/.svg/.pdf} if you want to get really fancy
done

这很好用,但是我的 svg2pdf 脚本有点慢(它使用 Inkscape),而且当我刚刚只更新了一页的时候,必须等待 90 秒或者其他什么时间来重建所有的 PDF 文件,这很烦人。

构建系统是让人困惑的

在过去,我对使用 makebazel 这样的构建系统来做我的小项目一直很反感,因为 bazel 是个大而复杂的东西,而 make 对我来说感觉有点神秘。我真的不想使用它们中的任何一个。

所以很长时间以来,我只是写了一个 bash 脚本或者其他的东西来进行构建,然后就认命了,有时候只能等一分钟。

ninja 是一个极其简单的构建系统

ninja 并不复杂!以下是我所知道的关于 ninja 构建文件的语法:创建一个 rule 和一个 build

rule 有一个命令(command)和描述(description)参数(描述只是给人看的,所以你可以知道它在构建你的代码时在做什么)。

rule svg2pdf
  command = inkscape $in --export-text-to-path --export-pdf=$out
  description = svg2pdf $in $out

build 的语法是 build output_file: rule_name input_files。下面是一个使用 svg2pdf 规则的例子。输出在规则中的 $out 里,输入在 $in 里。

build pdfs/variables.pdf: svg2pdf variables.svg

这就完成了!如果你把这两个东西放在一个叫 build.ninja 的文件里,然后运行 ninja,ninja 会运行 inkscape variables.svg --export-text-to-path --export-pdf=pdfs/variables.pdf。然后如果你再次运行它,它不会运行任何东西(因为它可以告诉你已经构建了 pdfs/variables.pdf,而且是最新的)。

Ninja 还有一些更多的功能(见手册),但我还没有用过。它最初是为 Chromium 构建的,所以即使只有一个小的功能集,它也能支持大型构建。

ninja 文件通常是自动生成的

ninja 的神奇之处在于,你不必使用一些混乱的构建语言,它们很难记住,因为你不经常使用它(比如 make),相反,ninja 语言超级简单,如果你想做一些复杂的事情,那么你只需使用任意编程语言生成你想要的构建文件。

我喜欢写一个 build.py 文件,或者像这样的文件,创建 ninja 的构建文件,然后运行 ninja

with open('build.ninja', 'w') as ninja_file:
    # write some rules
    ninja_file.write("""
rule svg2pdf
  command = inkscape $in --export-text-to-path --export-pdf=$out
  description = svg2pdf $in $out
""")

    # some for loop with every file I need to build
    for filename in things_to_convert:
        ninja_file.write(f"""
build {filename.replace('svg', 'pdf')}: svg2pdf {filename}
""")

# run ninja
import subprocess
subprocess.check_call(['ninja'])

我相信有一堆 ninja 的最佳实践,但我不知道。对于我的小项目而言,我发现它很好用。

meson 是一个生成 ninja 文件的构建系统

我对 Meson 还不太了解,但最近我在构建一个 C 程序 (plocate,一个比 locate 更快的替代方案)时,我注意到它有不同的构建说明,而不是通常的 ./configure; make; make install

meson builddir
cd builddir
ninja

看起来 Meson 是一个可以用 ninja 作为后端的 C/C++/Java/Rust/Fortran 构建系统。

就是这些!

我使用 ninja 已经有几个月了。我真的很喜欢它,而且它几乎没有给我带来让人头疼的构建问题,这让我感觉非常神奇。


via: https://jvns.ca/blog/2020/10/26/ninja--a-simple-way-to-do-builds/

作者:Julia Evans 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

相关内容

万兴科技:公司AI原生应用...
金融界8月5日消息,有投资者在互动平台向万兴科技提问:董秘您好,贵...
2025-08-06 06:44:37
高途联创罗斌:如何通过AI...
多知7月29日消息,2025年7月26日至28日,2025世界人工...
2025-07-30 10:14:48
夸克 AI 眼镜首次亮相,...
官宣!阿里巴巴正式预告首款自研 AI 眼镜,最快年内发布,支持高德...
2025-07-26 18:42:34
荣耀发布 MagicGUI...
松果财经获悉,【2025年7月26日,上海】在世界人工智能大会(W...
2025-07-26 14:43:32
在 AI 时代构建 MVP
作者 | Pierre Pureur、Kurt Bittner ...
2025-07-24 15:15:10
上半年AI应用成为外资重点...
今日,大盘普遍呈现调整态势,科创AI指数早盘下挫而后上探。截至10...
2025-07-04 16:42:00

热门资讯

Helix:高级 Linux ... 说到 基于终端的文本编辑器,通常 Vim、Emacs 和 Nano 受到了关注。这并不意味着没有其他...
使用 KRAWL 扫描 Kub... 用 KRAWL 脚本来识别 Kubernetes Pod 和容器中的错误。当你使用 Kubernet...
JStock:Linux 上不... 如果你在股票市场做投资,那么你可能非常清楚投资组合管理计划有多重要。管理投资组合的目标是依据你能承受...
Epic 游戏商店现在可在 S... 现在可以在 Steam Deck 上运行 Epic 游戏商店了,几乎无懈可击! 但是,它是非官方的。...
《Apex 英雄》正式可在 S... 《Apex 英雄》现已通过 Steam Deck 验证,这使其成为支持 Linux 的顶级多人游戏之...
从 Yum 更新中排除特定/某... 作为系统更新的一部分,你也许需要在基于 Red Hat 系统中由于应用依赖排除一些软件包。如果是,如...
通过 SaltStack 管理... 我在搜索Puppet的替代品时,偶然间碰到了Salt。我喜欢puppet,但是我又爱上Salt了:)...
如何在 Github 上创建一... 学习如何复刻一个仓库,进行更改,并要求维护人员审查并合并它。你知道如何使用 git 了,你有一个 G...
Opera 浏览器内置的 VP... 昨天我们报道过 Opera 浏览器内置了 VPN 服务,用户打开它可以防止他们的在线活动被窥视。不过...
如何检查你的 Linux 系统... 不知道在使用哪个初始化系统?以下是方法。每个主流 Linux 发行版(包括 Ubuntu、Fedor...