2015-05-17 51 views
3

我使用搖來建立一堆靜態網頁,然後我必須上傳到遠程主機,使用SFTP。目前,運行的cronjob搖:信號是否有什麼必須重建

git pull # get possibly updated sources 
./my-shake-system 
lftp ... # upload 

我想避免運行最後命令,如果搖實際上並沒有任何重建。有沒有辦法告訴搖擺「運行命令foo,在一切之後,只有當你改變了一些東西!」?

或者,也可以動搖報告它是否在進程退出代碼中做了些什麼?

我想我可以添加一個規則,取決於所有可能生成的文件,但似乎是多餘的和容易出錯的。

回答

2

目前沒有直接/簡單的方法來確定是否構建任何東西。對於更簡單的構建系統來說,這也不是一個有用的概念,因爲某些規則(尤其是那些定義storedValue以返回Nothing)將始終「重新運行」,但是很快就會決定不需要運行依賴於它們的規則。震動,這與重新運行一樣。我能想到的幾種方法,哪一種最可能取決於您的情況:

標籤有趣的規則

你可以標記每個有趣的規則(指產生一些需要上傳)與函數寫入一個特定的文件。如果該特定文件存在,則需要上傳。這可能會稍微好一些,就好像你做了多次Shake運行一樣,在第一件事情發生變化但第二件事沒有發生的情況下,該文件仍然存在。如果有意義,請使用IORef而不是文件。

使用剖析

搖擁有相當先進的評測。如果你通過shakeProfile=["output.json"]它會產生一個JSON文件,詳細說明什麼是內置的以及什麼時候。運行由Int編制索引,0用於最近的運行,並且排除任何內置任何運行。如果你有一個總是觸發的規則(例如寫入一個帶有alwaysRerun的虛擬文件),那麼如果同時發生任何事情,它就會重建。

觀看.shake.database文件大小

搖有一個數據庫,shakeFiles下儲存。每個不感興趣的運行都會增長一個相當小的數量(〜100字節) - 但是給定系統的固定大小。如果它的尺寸變化更大,那麼它做了一些有趣的事情。

在這些方法中,標記有趣的規則可能是最簡單和最直接的(儘管存在您忘記標記某些東西的風險)。

+0

謝謝。標記看起來很好。 –

+0

儘管天真地完成了,但是當使用'writeFileChanged'運行某個規則時,它現在也創建了標記,但沒有任何效果。 'writeFileChanged'並不告訴我它是否真的改變了文件。我可能必須使用我自己的'writeFileChanged'。 –

+0

這有點y,但是,是需要的(並且建議其他兩種方法不會真正起作用,因爲如果你得到那麼多,就會有很多重建)。 –