[英]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
。 有沒有辦法做到這一點?
編輯:我嘗試了一些實驗,如果我在禁用沙箱的情況下執行RULE1
和RULE2
,則能夠實現這一點。 這允許RULE2
訪問RULE1
的輸入而無需顯式列出它們。 這似乎很麻煩,但是如果有一種方法可以為規則共享一個沙箱,而不是在沒有沙箱的情況下執行兩個沙漏,那可能很好。
我不知道執行您所描述的方法的方法,但是還有其他一些策略可能對您有用。 (這里有一個額外的復雜性,我認為,這是RULE2
將無法訪問以前的狀態INPUT_FILES
,所以它不會有什么比較對,看看有什么在投入已經改變)。
一種策略是處理輸入文件,以便刪除所有無關緊要的部分,而RULE1
長時間運行的工具只會看到“重要”的東西。 當然,這完全取決於您的工具和規則執行的操作,但它可能起作用。
舉一個簡單的例子,您可以使用一個工具從代碼中刪除注釋(以保留行號的方式),然后編譯器操作只會看到僅代碼文件。 因此,如果對注釋進行更改,則編譯器的輸入是相同的,並且bazel會跳過該操作。
這類似於bazel使構建Java規則更具增量性所做的工作。 有一個工具可以從Java源代碼生成“標頭jar”,該工具僅包含類接口,而上游規則則只能看到標頭jar。 這樣,只有對類的接口進行更改才能使上游規則重新運行,而對注釋或方法實現的更改則不會。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.