2010-04-09 118 views
2

我建立了我的c#項目後,將一個dll文件放在一個特定的目錄中後,我有一個後生成腳本。這個DLL保存在SVN中。我的問題是,有沒有辦法在構建我的項目時知道該dll沒有更改,並且不知道是否將其複製到目錄中,以便SVN不會修改副本?如何比較dll文件

回答

0

快速簡單的方法是統計兩個文件並比較它們的修改時間 - 如果目標目錄中的DLL比您正在複製的DLL舊,則只複製該文件。

更健壯但速度更慢的方法是使用任意數量的diff程序來逐字節比較兩個DLL。

0

除非我誤解了你的問題,否則你不需要做任何事情。如果文件沒有被修改,SVN知道這一點,不會提交。

編輯: 你已經澄清在回答蒂姆,你這樣做是爲了節省其他開發者的建設麻煩。這是錯誤的方式來做到這一點。不應該使用源代碼控制來保存源代碼的輸出。相反,你應該:

  1. 得到持續集成處理您的樹
  2. 發送所有輸出從1至AA普通股
  3. 告訴所有的開發者把眼光放在這個份額,如果他們不想要建立的東西
+0

我看到一個紅色的「!」每次我建立項目時在dll文件上。你的意思是即使它有這個紅色的「!」標記,當我提交時,SVN不會提交dll文件? – queandans 2010-04-09 19:40:48

+0

一般來說,表示文件已被修改,所以這意味着你會得到一個新的副本簽入。請記住,即使你建立完全相同的源,你會得到一個(稍微)不同的二進制文件每次(鏈接器時間戳,代碼簽名時間戳等)注意:如果是「紅色!」你的意思是一個烏龜覆蓋層記住,這些覆蓋是不是100%準確。 – 2010-04-10 14:28:03

1

你爲什麼把你構建成svn的dll?

編輯

你應該找出一個更好的辦法來做到這一點 - 就像有一個安裝程序或FTP服務器的地方,開發人員可以得到您的DLL。將您的派生作品放入svn是一個非常糟糕的主意。特別糟糕。

+0

,因此同一公司的開發人員可以使用此dll構建插件,而無需獲取所有源代碼並構建它。 – queandans 2010-04-09 19:43:32

+3

這不是一個很好的做法。如果他們沒有構建它,那麼我會將構建/安裝在不同的服務器上進行下載。源頭控制應該是源頭。屬於svn的唯一二進制文件是不會改變的第三方文件。 – Tim 2010-04-09 19:56:00

+1

我同意蒂姆。在VCS中自動生成文件會給你帶來各種痛苦,因爲很難找出哪個二進制文件是「正確的」。當開發人員檢查舊版本時,痛苦開始了,建立.dll並檢查這個。現在VCS中沒有任何跡象表明現在最新的.dll實際上是一箇舊版本。 – Rudi 2010-04-10 15:08:53

0

SVN應該已經爲你照顧好了。如果文件之間確實沒有區別,並且您將其中一個替換爲另一個,SVN將不會考慮將文件「修改」,即使它具有新的時間戳。 SVN保留了該文件的基本版本,並使用diff本身來查看哪些文件需要提交。所以你可以隨時複製dll,SVN會照顧其餘的。

0

試圖無論如何承諾,看看SVN是否與你的圖形界面一致。

如果它試圖提交,那麼無論構建文件是否每次都包含一些不同的信息(可能是時間戳或其他東西)。由於該文件不同,您可能希望實際提交。您可以檢查您的編譯選項以查看它是否包含某種時間戳記,但是如果找不到這樣的選項,則很難判斷dll的更改是否有意義,或者只是某些編譯器元數據,

0

可以將二進制文件檢入到subversion中。原因是下游用戶(QA或用戶)可能沒有從源代碼構建的環境。他們也對從源代碼構建不感興趣。

這裏的問題是一個建築管理問題 - 當你釋放該DLL時,以及如果QA發現你的DLL有問題,你如何跟蹤源代碼。

時間戳不是一個可靠的方法。

爲了達到這個目的,你需要在建築物管理中有一些東西。在我的項目中,我們的構建腳本查找涉及的文件的最大修訂版本號(請注意,這不是當前修訂版本號,因爲您應該可以在將來構建,但產生相同的結果)。然後它將這個數字戳到DLL的版本資源。在我們對結果滿意後,我們通過手動將二進制文件拷貝到subversion中的文件夾並簽入來釋放它。

如果QA發現一個錯誤,我們總是可以回到構建DLL的狀態(通過查找了解版本號)並找出問題所在。