最近在做svn許可權管理系統,要求在windows下和linux下均可運行,由於前期的代碼編寫都是基於windos的,所以今天對代碼進行了改寫,以適應linux系統的運行,linux的測試環境為ubuntu。在此幾下中間的修改過程和遇到的問題。
1.分行符號問題
已知的各個作業系統的分行符號號如下:
OS |
Line Break |
widows |
\r\n |
linux\unix |
\n |
MAC |
\r |
一般作業系統上的運行庫會自動決定文字檔的換行格式. 如一個程式在windows上運行就產生CR/LF換行格式的文字檔,而在Linux上運行就產生LF格式換行的文字檔. 在一個平台上使用另一種分行符號的檔案檔案可能會帶來意想不到的問題, 特別是在編輯程式碼時. 有時候代碼在編輯器中顯示正常, 但在編輯時卻會因為分行符號問題而出錯. 很多文本/代碼編輯器帶有分行符號轉換功能, 使用這個功能可以將文字檔中的分行符號在不同格式單互換.
斷行符號和換行曆史
關於“斷行符號”(carriage return)和“換行”(line feed)這兩個概念的來曆和區別。
在電腦還沒有出現之前,有一種叫做電傳打字機(Teletype Model 33)的玩意,每秒鐘可以打10個字元。但是它有一個問題,就是打完一行換行的時候,要用去0.2秒,正好可以打兩個字元。要是在這0.2秒裡面,又有新的字元傳過來,那麼這個字元將丟失。
於是,研製人員想了個辦法解決這個問題,就是在每行後面加兩個表示結束的字元。一個叫做“斷行符號”,告訴打字機把列印頭定位在左邊界;另一個叫做“換行”,告訴打字機把紙向下移一行。
這就是“換行”和“斷行符號”的來曆,從它們的英語名字上也可以看出一二。
後來,電腦發明了,這兩個概念也就被般到了電腦上。那時,儲存空間很貴,一些科學家認為在每行結尾加兩個字元太浪費了,加一個就可以。於是,就出現了分歧。
Unix系統裡,每行結尾只有“<換行>”,即“\n”;Windows系統裡面,每行結尾是“<換行><回 車>”,即“\n\r”;Mac系統裡,每行結尾是“<斷行符號>”。一個直接後果是,Unix/Mac系統下的檔案在Windows裡打 開的話,所有文字會變成一行;而Windows裡的檔案在Unix/Mac下開啟的話,在每行的結尾可能會多
那麼怎樣去屏蔽這種差異呢?
既然rails是跨平台的,那麼ruby語言輸出分行符號的時候肯定會自動判斷是那種系統,並輸出相應的分行符號,我們可以利用這點來實現。即:用ruby語言中的puts輸出一行,會自動換行。
2. 路徑問題
在windows的命令列提示符下,目錄的分隔字元是“\”,但“\”同時也是逸出字元,並且無法在unix、linux下運行,所以ruby支援windows下使用“/”作為分隔字元,但是注意:win32ole之類的功能不能這樣用。
所以對目錄的訪問和建立,我們可以通過ruby的Dir、File類來操作,分隔字元用“/”,這樣就可以避免了。但是有一點需要注意,Dir建立目錄時不可建立父目錄,這時可以用FileUtils類來代替,FileUtils類支援自動建立父目錄。
3.基於apache的svn版本控制系統
svn版本控制系統的環境是apache+subversion,通過域使用者認證進行按路徑授權,在windows下的域使用者認證是通過sspi實現的,但是在linux下找不到相應的sspi檔案,網上關於這方面的結論是sspi僅有windows版本,不存在相應的linux版本,後來通過svn管理員獲知,公司目前的svn庫是通過openldap實現的域使用者認證,同時openldap在windows、linux下均可運行。
這裡需要強調一點的是,linux下的apache組成和windows下的不同。
windows下是一鍵安裝式的,所有的配置都在httpd.conf中,module等檔案也都中規中矩的在特定檔案夾中。
在linux中,設定檔有多個,且日誌、設定檔都不在同一個目錄中,但是主要的設定檔是/etc/apache2/apache2.conf中,其餘的設定檔都是通過include引入的,而且apache2.conf中制定了apache需要的mod檔案。特別指明一點,mods-avaliabe是可以擷取的mod檔案,但是不一定適用,如果你的mod檔案需要在檔案中價值,需要用連結的方式放在mods-enabled中,這個在apache2.conf可以看出來。