簡體   English   中英

在Bazel規則中,如何從緩存命中/未命中檢測中排除某些輸入文件

[英]In a Bazel rule, how can I exclude certain input files from cache hit/miss detection

我有一個bazel genrule,它運行自定義工具來處理某些輸入文件集並生成輸出。 問題在於自定義工具每次運行都會花費很長時間,但是並非輸入文件集的每項更改都與自定義工具的輸出有關。 為了檢測更改是否重要,我有另一個腳本可以解析輸入內容,並在自定義工具的輸出將有所不同時迅速提供信息。

我無法在Bazel中實現上述功能。 我想實現的方式如下

INPUT_FILES --------> [RULE1] --------> OUTPUT
     |                   ^
     |                   |
     |                   |
      --------------> [RULE2]

RULE2's輸出應確定RULE1是否應運行。 但是當它必須運行時, INPUT_FILES應該對RULE1可用。 因此,在執行RULE1 ,基本上只RULE2's輸出用於緩存命中/未命中計算,而應忽略INPUT_FILES 有沒有辦法做到這一點?

編輯:我嘗試了一些實驗,如果我在禁用沙箱的情況下執行RULE1RULE2 ,則能夠實現這一點。 這允許RULE2訪問RULE1的輸入而無需顯式列出它們。 這似乎很麻煩,但是如果有一種方法可以為規則共享一個沙箱,而不是在沒有沙箱的情況下執行兩個沙漏,那可能很好。

我不知道執行您所描述的方法的方法,但是還有其他一些策略可能對您有用。 (這里有一個額外的復雜性,我認為,這是RULE2將無法訪問以前的狀態INPUT_FILES ,所以它不會有什么比較對,看看有什么在投入已經改變)。

一種策略是處理輸入文件,以便刪除所有無關緊要的部分,而RULE1長時間運行的工具只會看到“重要”的東西。 當然,這完全取決於您的工具和規則執行的操作,但它可能起作用。

舉一個簡單的例子,您可以使用一個工具從代碼中刪除注釋(以保留行號的方式),然后編譯器操作只會看到僅代碼文件。 因此,如果對注釋進行更改,則編譯器的輸入是相同的,並且bazel會跳過該操作。

這類似於bazel使構建Java規則更具增量性所做的工作。 有一個工具可以從Java源代碼生成“標頭jar”,該工具僅包含類接口,而上游規則則只能看到標頭jar。 這樣,只有對類的接口進行更改才能使上游規則重新運行,而對注釋或方法實現的更改則不會。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM