文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

ninja:一个简单的构建方式

2024-12-03 17:35

关注

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

增量构建很有用

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

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

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

构建系统是让人困惑的

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

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

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

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

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

  1. rule svg2pdf
  2. command = inkscape $in --export-text-to-path --export-pdf=$out
  3. description = svg2pdf $in $out

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

  1. 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

  1. with open('build.ninja', 'w') as ninja_file:
  2. # write some rules
  3. ninja_file.write("""
  4. rule svg2pdf
  5. command = inkscape $in --export-text-to-path --export-pdf=$out
  6. description = svg2pdf $in $out
  7. """)
  8.  
  9. # some for loop with every file I need to build
  10. for filename in things_to_convert:
  11. ninja_file.write(f"""
  12. build {filename.replace('svg', 'pdf')}: svg2pdf {filename}
  13. """)
  14.  
  15. # run ninja
  16. import subprocess
  17. subprocess.check_call(['ninja'])

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

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

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

  1. meson builddir
  2. cd builddir
  3. ninja

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

就是这些!

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

 

来源:Linux中国内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯