posts - 56, comments - 77, trackbacks - 0, articles - 1
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          問題: 在某臺(tái)機(jī)器上運(yùn)行正常的環(huán)境, 換到另外一臺(tái)機(jī)器就gp, 或需要很繁瑣的從頭配置, 浪費(fèi)從幾小時(shí)到幾天不等的時(shí)間.

          原因, 則通常包括環(huán)境的各個(gè)部分散落在不同角落, 不是少了這個(gè)就是少了那個(gè), 或不同機(jī)器上版本不一樣; 還包括在配置中使用硬編碼的絕對(duì)路徑, 依賴全局環(huán)境變量或?qū)傩缘?

          機(jī)器環(huán)境雖然各有各的不同, 但依然有可能創(chuàng)建一個(gè)"環(huán)境無關(guān)的環(huán)境"

          1. 使用相對(duì)路徑代替絕對(duì)路徑

          關(guān)鍵是如何獲得當(dāng)前路徑, 如何確定根路徑, 如何確保目錄結(jié)構(gòu)

          1. Windows和Unix都有內(nèi)置的環(huán)境變量來表示當(dāng)前路徑, 分別是 %cd% 和 $PWD

          2. Windows批處理腳本中, 還可以使用 %~dp0% 獲得腳本所在路徑; 而在Unix Bash 腳本中, 則可以使用 `pwd`, 即獲得 pwd 命令的輸出

          3. 如果總是需要引用某個(gè)根路徑的話, 則可以使用環(huán)境變量來定義根路徑(參見后面的環(huán)境變量). 其實(shí)相對(duì)路徑配合固定的目錄結(jié)構(gòu), 大大削減了對(duì)顯式定義根路徑的需求

          4. 那么如何保證目錄結(jié)構(gòu)是固定的呢? 自然是使用配置管理系統(tǒng)

          2. 使用配置管理系統(tǒng)(版本控制系統(tǒng))

          配置管理系統(tǒng)不只是放源代碼的, 只要有配置管理需求或配置管理能帶來好處, 或需要有唯一的官方來源, 都可以使用配置管理系統(tǒng)來管理; 環(huán)境的配置文件, 環(huán)境本身, 都可以置入配置管理之下. 有些公司的版本控制系統(tǒng)只放源代碼, 連測(cè)試代碼都分開另放.

          1. 強(qiáng)制使用配置管理可解決固定的目錄結(jié)構(gòu)的問題

          2. 使用配置管理還可以解決丟三落四的問題

          3. 自然也可以解決所用工具版本不一致的問題

          這里有幾個(gè)常見的問題:

          1. 大型的系統(tǒng)軟件如何處理, 比如 JDK, VC++編譯器等, 是否也需要置入版本控制; 這個(gè)基本不用, 如果對(duì)其特定的版本有需求, 可在腳本中加入檢查其版本的邏輯, 不滿足則提示并退出即可

          2. 依賴的大量二進(jìn)制庫如何處理; 如果有必要可使用依賴管理工具如 Maven, Ivy 等, 而用于存放依賴的本地倉庫依然應(yīng)該置入配置管理, 哪怕不用其版本控制功能, 而只是利用其官方來源/備份存檔等好處

          3. 必須放在特定位置的文件如何處理, 比如某個(gè)文件必須放在/etc目錄下; 這個(gè)文件還是可以放在配置管理下的目錄中, 而在/etc下創(chuàng)建符號(hào)鏈接來指向它; 并提供腳本來干這件事.

          3. 環(huán)境變量

          必要時(shí)使用環(huán)境變量來引用環(huán)境. 全局的環(huán)境變量可用作缺省值, 在腳本中覆蓋它(基本上, 這是"用戶自定義屬性"的一個(gè)實(shí)例).

          4. 缺省值 + 用戶自定義屬性

          這是創(chuàng)建"環(huán)境無關(guān)的環(huán)境"的核心機(jī)制. 無論如何, 環(huán)境要在不同機(jī)器上部署, 總會(huì)需要修改某些配置, 以適應(yīng)宿主機(jī)器. 然而前面我們提到, 所有配置都已置入版本控制. 如果我們直接修改, 則每個(gè)環(huán)境中都會(huì)存在未提交的本地修改. 這是我們不希望看到的, 因?yàn)楫?dāng)我們升級(jí)配置并更新到所有部署時(shí), 可能會(huì)產(chǎn)生沖突. 這里其實(shí)是兩個(gè)層面的問題:

          1. 提供一種機(jī)制, 當(dāng)環(huán)境與缺省配置不一致時(shí), 允許用戶修改
          2. 用戶修改的文件應(yīng)避免與官方文件更新的沖突

          先說第一個(gè).

          缺省值當(dāng)然可以直接定義在腳本或配置文件中. 而多數(shù)常用的腳本和配置系統(tǒng)都提供了用戶定義屬性覆蓋缺省值的機(jī)制. 比如:

          1. Windows批處理: set path=my_extra_path;%path%

          2. Bash: export PATH=my_extra_path:$PATH

          3. Ant:

            <property file="user.properties"/> <!-- user.properties 中可定義任何后面引用到的屬性, 以覆蓋其缺省值-->

            <property name="src.dir" path="${basedir}" /> <!-- 定義"src.dir"的缺省值-->

          4. CruiseControl:

            <property name="src.dir" value="." /> <!-- 定義"src.dir"的缺省值-->

            <property file="user.properties"/> <!-- user.properties 中可定義任何后面引用到的屬性, 以覆蓋其缺省值-->

          5. 注意Ant的屬性是只讀的, 先入為主. CruiseControl的屬性則是后發(fā)制人.

          再說第二個(gè).

          有一個(gè)很簡單的解決辦法, 就是把用戶自定義屬性置入單獨(dú)的文件, 并且不要把它提交到版本控制系統(tǒng)中(一個(gè)理由是這一部分相對(duì)整個(gè)組織來說, 不存在也不需要唯一的官方來源)

          前面例子中的 user.properties 就是一個(gè)用戶自定義屬性文件, 只存在每個(gè)用戶自己的機(jī)器上, 不在配置庫中. 在Windows和Bash腳本中也可以類似處理

          1. Windows: call user_env.bat

          2. Bash: source ./user_env.sh 或 . ./user_env.sh

          隨之而來的一個(gè)問題是, 這個(gè)用戶相關(guān)的文件應(yīng)該放在何處. 這里其實(shí)約定好就可以了, 比如當(dāng)前路徑, 根路徑, 甚至user的home路徑都可以

          參考借鑒

          1. 至此, 這套東西在不同的機(jī)器上部署時(shí), 只要從版本控制系統(tǒng)中check out出來即可使用了. 更進(jìn)一步, 還可以提供腳本, 即生成器, 自動(dòng)探測(cè)用戶的環(huán)境, 來生成全套配置, 類似Rails生成應(yīng)用框架那樣.

          2. 其實(shí), 這是一個(gè)規(guī)范性或標(biāo)準(zhǔn)性的問題. Neal Ford 在<<Productive Programmer: 卓有成效的程序員>>中, 用一章的篇幅詳述了各種解決方案, 包括配置管理, 符號(hào)鏈接等, 除此之外, 他還建議可以/應(yīng)該使用虛擬機(jī)來統(tǒng)一項(xiàng)目組的開發(fā)環(huán)境等. 參見<<Productive Programmer: 卓有成效的程序員>>第五章.

          3. 另請(qǐng)參閱<<CruiseControl Enterprise 最佳實(shí)踐 (3) : Configuring CruiseControl the CruiseControl way>>, 是創(chuàng)建環(huán)境無關(guān)的持續(xù)集成環(huán)境的實(shí)例


          評(píng)論

          # re: 環(huán)境無關(guān)的環(huán)境  回復(fù)  更多評(píng)論   

          2009-06-05 09:05 by 隔葉黃鶯
          gp 是什么意思
          %~dp0% 怎么用啊?

          # re: 環(huán)境無關(guān)的環(huán)境  回復(fù)  更多評(píng)論   

          2009-06-05 11:04 by 切爾斯基
          @隔葉黃鶯

          可參考 http://luck-donkey.javaeye.com/blog/360342

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 巴楚县| 满洲里市| 闵行区| 温宿县| 南木林县| 庆城县| 江津市| 留坝县| 龙江县| 栖霞市| 金秀| 铁力市| 灵璧县| 云霄县| 祁门县| 汤阴县| 竹山县| 右玉县| 浪卡子县| 株洲市| 柳河县| 彰武县| 芷江| 汝南县| 裕民县| 明光市| 江孜县| 闽侯县| 石渠县| 城步| 浙江省| 台江县| 宜兰县| 海兴县| 临沂市| 夹江县| 横山县| 城固县| 江口县| 卫辉市| 新巴尔虎左旗|