跨平臺代碼換行符的問題處理

背景概述

一般,咱們使用git作源碼版本控制,在windows平臺開發源碼並進行單元測試,而後打包部署到linux平臺進行集成測試或系統測試。linux

除源碼以外,咱們會爲部署寫一些自動化的腳本,方便服務的啓動和關閉。因爲腳本文件是直接打包並上傳到linux平臺的,而windows平臺和linux平臺的換行符不一樣,這就致使了腳本在linux平臺上執行錯誤。git

相關操做

如上圖所示,在默認的狀況下,git遠程倉庫(Linux)的代碼換行符是LF(linux平臺換行符),經過git clone或git pull將代碼拉到本地(windows平臺),git會自動將換行符替換成CRLF。本地代碼經過git push推送到遠程倉庫,git又會自動替換成linux換行符。
另外,IDEA新建文件,默認也是使用平臺的換行符,即windows平臺使用CRLF。shell

在測試階段,須要頻繁的更新文件,腳本也不便單獨部署,手動解決換行符的問題(IDEA上能夠作)比較低效。windows

本文就這個問題給出解決方案。bash

方案一:別給我改

問題出現的緣由,是由於git和IDEA考慮了平臺換行符的兼容性,其實以LF換行的文件,在windows也能夠良好的識別。因此咱們能夠修改git和idea的行爲,不讓它更改換行符。ide

git有兩個配置項,與換行符相關:工具

core.autocrlf
    - true    提交時轉換爲LF,檢出時轉換爲CRLF(默認行爲)。
    - false   提交檢出均不轉換。
    - input   提交時轉換爲LF,檢出時不轉換

core.safecrlf
    - true    拒絕提交包含混合換行符的文件
    - false   容許提交包含混合換行符的文件
    - warn    提交包含混合換行符的文件時,給出警告

由於咱們只是想確保本地的代碼也使用LF換行符,並不打算改變遠程倉庫的換行符,因此建議設置以下:單元測試

core.autocrlf=input
core.safecrlf=true

IDEA上也能夠設置,新建的文件使用的換行符:測試

idea的設置

這些設置並不能改變已有文件的換行符,最直接的方式是把本地倉庫刪除掉,從新從遠程倉庫拉代碼。idea

可是這個方案存在着必定的難度和隱患。說難,是由於須要在團隊內部進行宣貫,確保每一個人都按照這樣作了;說隱患,是新員工未必能及時遵照這個規定,或者在從新安裝軟件的時候,又恢復到了默認的設置。

不過,這並不算什麼大事情,只是有點麻煩。

方案二:讓腳本改

之因此要修改換行符,是由於咱們要部署到linux平臺上去用,那麼可讓打包腳本統一修改文件的換行符。

藉助於dos2unix工具,腳本能夠直接調用命令,將要修改的文件路徑做爲參數。要遞歸修改某個目錄,也能夠經過shell腳原本實現。

首先,從連接下載工具,放置到合適的目錄。

經過相似於下面的命令,實現遞歸修改文件:

find D:/projects/release_dir -type f ! -name "*.jar" | xargs dos2unix.exe

# find:搜索文件系統
# -type f:限定文件
# !:邏輯非
# -name:匹配文件名

這個方案直接面對問題進行處理,不和平臺之間換行符轉換的問題進行糾纏,也沒必要要求同事進行各類設置。只一條:經過打包腳原本打包。

而通常狀況下,咱們都樂於使用打包腳原本自動打包,因此這一條也沒有給開發人員添加任何負擔。

總結

我更推薦使用第二種方案,它顯得輕量小巧,不和其餘問題糾纏夾雜,乾淨利索。

相關文章
相關標籤/搜索