Linux中國

ninja:一個簡單的構建方式

大家好!每隔一段時間,我就會發現一款我非常喜歡的新軟體,今天我想說說我最近喜歡的一款軟體: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 文件,這很煩人。

構建系統是讓人困惑的

在過去,我對使用 make 或 bazel 這樣的構建系統來做我的小項目一直很反感,因為 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中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的郵箱地址不會被公開。 必填項已用 * 標註

    這個站點使用 Akismet 來減少垃圾評論。了解你的評論數據如何被處理。

    More in:Linux中國

    Linux中國

    捐贈 Let's Encrypt,共建安全的互聯網

    隨著 Mozilla、蘋果和谷歌對沃通和 StartCom 這兩家 CA 公司處罰落定,很多使用這兩家 CA 所簽發證書的網站紛紛尋求新的證書籤發商。有一個非盈利組織可以為大家提供了免費、可靠和安全的 SSL 證書服務,這就是 Let's Encrypt 項目。現在,它需要您的幫助
    Linux中國

    關於Linux防火牆iptables的面試問答

    Nishita Agarwal是Tecmint的用戶,她將分享關於她剛剛經歷的一家公司(印度的一家私人公司Pune)的面試經驗。在面試中她被問及許多不同的問題,但她是iptables方面的專家,因此她想分享這些關於iptables的問題和相應的答案給那些以後可能會進行相關面試的人。 所有的問題和相應的答案都基於Nishita Agarwal的記憶並經過了重寫。 嗨,朋友!我叫Nishita Agarwal。我已經取得了理學學士學位,我的專業集中在UNIX和它的變種(BSD,Linux)。它們一直深深的吸引著我。我在存儲方面有1年多的經驗。我正在尋求職業上的變化,並將供職於印度的P
    Linux中國

    Lets Encrypt 已被所有主流瀏覽器所信任

    旨在讓每個網站都能使用 HTTPS 加密的非贏利組織 Lets Encrypt 已經得了 IdenTrust的交叉簽名,這意味著其證書現在已經可以被所有主流的瀏覽器所信任。從這個裡程碑事件開始,訪問者訪問使用了Lets Encrypt 證書的網站不再需要特別配置就可以得到 HTTPS 安全保護了。 Lets Encrypt 的兩個中級證書 ...