從1.x升級?
現代結構(2+)代表了軟件的幾乎完全重新實現和重組。已經過去了 broken in two 清理,更明確,等等。在某些情況下,升級只需要基本搜索&replace;在其他情況下,需要做更多的工作。
如果您仔細閱讀本文檔,它將引導您朝正確的方向前進,直到您完全升級。如果您在Fabric 1中使用的任何功能未在此處列出,請提交一張罰單。 on Github 我們會盡快更新。
警告
從2.0釋放線開始,織物2 not 與1.x!的100%功能對等!一些特性已經被顯式地刪除了,但其他特性還沒有被移植,要么是由于時間限制,要么是因為所說的特性需要在現代環境中重新檢查。
請查看以下信息,包括 升級詳細信息 在提交錯誤報告之前,包含一個非常詳細的列表的部分!
也看到 the roadmap 有關版本控制的其他說明。
為什么要升級??
我們不想以任何特定的順序,呼吁對現代 Fabric 進行一些特定的改進,這可能會使升級值得您花時間。
注解
這些都列在醫生的其他部分,所以如果你已經被賣了,就跳過那里。
python 3兼容性(具體來說,我們現在支持2.7和3.4+);
線程安全-不再要求多處理并發性;
API重新組織
fabric.connection.Connection
對象而不是全局模塊狀態;對命令行解析器進行了大修,以允許在每個任務的基礎上使用常規的GNU/POSIX樣式標志和選項(不再使用
fab mytask:weird=custom,arg=format
;任務組織更加明確和靈活/具有更少的“魔力”;
任務可以聲明其他任務始終在自己之前或之后運行;
配置大規模擴展,允許多個配置文件和格式、env vars、每個用戶/項目/模塊配置等;
ssh配置文件加載在默認情況下是啟用的,并且已經擴展了:系統/用戶/運行時文件選擇;
shell命令執行API在本地和遠程方法調用之間保持一致-不再區分
local
和run
(當然,除了運行命令的地方?。?;shell命令更加靈活:交互行為、同時捕獲和顯示(現在適用于本地子進程,而不僅僅是遠程進程)、編碼控制和自動響應;
對ssh層使用paramiko的API會更加透明-例如
fabric.connection.Connection
允許控制給予的禁運SSHClient.connect
;網關/跨接主機功能提供
ProxyJump
樣式“native”(無代理命令子進程)選項,可以無限嵌套;
要調用的“側放”?
我們鏈接到了上面關于這個的一個注釋,但要明確:現代結構實際上是幾個獨立的庫,并且任何與ssh或網絡無關的東西 split out into the Invoke project .
這意味著,如果您是一組僅利用結構執行任務的用戶,或者 local
,從未使用過 run
, put
或類似的 你不需要再使用布料本身了 并且可以簡單地 改為調用“sidegrade” .
您仍然希望閱讀此文檔以了解情況的變化,但請注意,您可以避開 pip install invoke
不需要結構、參數、密碼依賴性或其他任何東西。
從invoke中使用現代結構?
我們打算增強現代織物,直到它包含織物1的大部分用例,這樣您就可以使用 fab
而fabfiles本身并不太關心它是如何建立在invoke之上的。
然而,在這一點之前——對于中級到高級用戶來說,這一點非常有用——事實上,現代結構的設計考慮到了庫或直接的API使用。 在某些情況下,完全可以使用invoke來滿足您的cli需求,并在invoke任務中將結構用作純API。
換句話說,你可以避開 fab
/除非你發現自己非常需要特別會議的便利設施,比如 --hosts
諸如此類。
同時運行兩種結構版本?
為了幫助逐步升級,現代織物可以安裝在名稱下 fabric2
(除了“正?!碧峁?.0+版本的 fabric
)并且可以與1.x版的安裝共存。
因此,如果您有一個大的代碼庫,并且不想一次跳到現代版本,那么可以同時使用兩種結構1 (fabric
,就像你以前安裝的一樣)和現代織物 fabric2
)同時駐留在您的Python環境中。
注解
我們強烈建議您最終使用Fabric1將所有代碼遷移到版本2或更高版本,以便您可以返回到 fabric
姓名。 fabric2
作為一個獨特的包和模塊,它的目的是要有一個權宜之計,而不會有任何 fabric3
或者更高(尤其是因為其中一些名字已經被取了?。?/p>
有關如何獲取 fabric2
包的版本,請參見 安裝現代 Fabric 組件 fabric2 .
升級詳細信息?
這是一份詳盡的 all Fabric1.x功能以及1.x中沒有的新to-invoke-or-Fabric-2功能;它指定是否需要升級,如果需要,如何升級,并跟蹤尚未在現代版本中實現的功能。
大多數部分以表格形式分解,如下所示:
結構1特征或行為 |
狀態,詳見下文 |
遷移說明、遷移原理等 |
下面是“狀態”列的典型值,盡管其中一些值有點松——請確保在所有情況下都閱讀“注釋”列!還請注意,事情并不是鐵面無私的——例如,如果有足夠多的用戶請求,任何“刪除的”項目都有返回的機會,或者如果使用案例表明解決方法不足。
端口 :已可用,可能重命名或移動(經常移動到 Invoke 代碼庫)
懸而未決的 :適合,但尚未移植,很適合補丁。 這些條目鏈接到相應的GitHub票據 -請不要做新的!
遠離的 明確地 not 移植(不再符合視力,維護價值比太差等),不太可能恢復。
以下是用于導航的快速本地目錄:
一般/概念?
現代結構完全兼容python 3;作為一項成本,python 2.5支持(fabric 1的一個長期功能)已經被放棄了——事實上,我們已經放棄了對任何比python 2.7更老的支持。
cli面向任務的工作流仍然是一個主要的設計目標,但是庫用例不再是二級公民;相反,庫功能是首先設計的,并且在其基礎上構建了cli/task功能。
此外,在cli用例中,版本1過分強調了“lazy”交互式提示的身份驗證機密,甚至連接參數,部分原因是缺乏強大的配置機制。隨著時間的推移,很明顯,這不值得折中使用混淆的非交互行為和困難的調試/測試過程。
現代結構采用了一種可以說更干凈的方法(基于隨著時間推移添加到v1的功能),鼓勵用戶利用配置系統和/或在 開始 如果系統確定中途缺少信息,則會引發異常而不是提示。
invoke的設計包括 explicit user-facing testing functionality ;如果您以前沒有找到使用代碼為結構編寫測試的方法,那么現在應該更容易了。
我們建議您盡早編寫測試;它們將幫助您明確升級過程,并使過程更安全!
API組織?
高級代碼流和API成員關注點。
通過導入所有內容 |
遠離的 |
所有有用的導入現在都可以在頂級級別使用,例如 |
全局配置連接參數(通過 |
遠離的 |
主API現在正確了oop:實例化 |
強調將序列化的“主機字符串”作為設置用戶、主機、端口等的方法 |
移植/移除 |
此外,許多參數/設置等在v1中需要主機字符串,現在需要 |
使用“角色”作為主機字符串的全局命名列表 |
端口 |
這個需求現在由 See the line items for |
任務功能和裝飾?
注解
幾乎所有與任務相關的功能都在invoke中實現;有關更多詳細信息,請參見 execution 和 namespaces 文檔。
默認情況下,任務從 |
端口 |
這種行為在今天基本上是相同的,只做了一些小的修改和增強(例如對加載過程的更嚴格控制,以及實現自定義加載程序邏輯的API鉤子——請參見 loading-collections ) |
“經典”樣式的隱式任務函數缺少 |
遠離的 |
即使是在v1中,它們也在逐漸消失,現在通過invoke的 |
“新”風格 |
端口 |
基本上是一樣的,盡管現在超級大國- |
任意任務函數參數(即 |
端口 |
這將獲取自己的行項目,因為:任務現在必須 這就犧牲了v1的一小部分“快速DSL”,以換取更清晰、更易于理解/調試和更多用戶可重寫的API結構。 作為副作用,它減少了“功能模塊”和“方法類”之間的區別;用戶可以更容易地從“功能模塊”開始,并在需求增長/變化時遷移到“方法類”。 |
通過導入爬行隱式生成任務樹 |
移植/移除 |
名稱空間構造現在更加明確;例如,在 However, the root 我們可以稍后恢復(以可選方式)導入的模塊掃描,因為使用顯式命名空間對象仍然允許用戶控制結果樹。 |
|
這些裝飾師非常喜歡 Fabric 1的“DSL”紋理,并且沒有被優先考慮重寫,盡管他們可能以某種形式返回,可能更快而不是更晚。 |
|
|
端口/待機 <https://github.com/pyinvoke/invoke/issues/63>`__ |
并行執行目前在API級別通過 這個問題需要在更高的級別上解決,而不僅僅是ssh目標,因此這將鏈接到一個調用級別的票據。 |
|
這是重寫中最重要的“缺少功能”之一;鏈接用于調用跟蹤程序。 |
|
|
端口 |
雖然沒有與v1共享許多實現細節,但現代結構(via invoke)公開了 |
cli參數、選項和行為?
將任務參數暴露為自定義冒號/逗號分隔的CLI參數,例如 |
遠離的 |
cli參數現在是合適的gnu/posix樣式的長和短標志,包括將短標志放在一起、空格或等號來附加值、可選值等等。見 invoking-tasks . |
任務定義名稱直接鏡像在命令行上,例如用于任務 |
遠離的 |
任務名稱現在從下劃線轉換為連字符。任務 |
能夠在一個命令行中調用多個任務,例如 |
端口 |
工作很棒! |
|
端口 |
移植于2.2。 |
|
遠離的 |
要永久禁用代理的使用,請設置配置值 |
|
遠離的 |
這個的config和kwarg版本被移植,但目前沒有cli標志。通常,“可以在運行時用shell env變量設置配置值”子句有效,因此 may 不被移植,視情況而定。 |
|
遠離的 |
請參見有關交互提示離開的注釋 一般/概念 . 如果沒有中間會話提示,則不需要此選項。 |
|
端口 |
|
|
顏色工作還沒有完成,這是可能丟失的部分之一。我們不確定它在v1中的使用頻率,所以它可能不會再次出現,但一般來說,我們喜歡使用顏色作為額外的輸出向量,所以… |
|
|
端口 |
這是現在的標準 |
|
還沒有預告,可能會。 |
|
|
端口/待機 <https://github.com/fabric/fabric/issues/1805>`__ |
已經沒有顯式連接緩存了,因此不必太急地斷開連接。然而,調查和潛在的特征切換仍然懸而未決。 |
|
端口 |
現在分為 |
|
可以設置全局 因此,如果有足夠多的用戶注意到這一點,我們將考慮一個在很大程度上模仿v1行為的特性add:string成為 |
|
|
遠離的 |
這些似乎不夠用,不值得移植,特別是因為它們落在了通常的傘下“帕拉米科級連接直通”所涵蓋的 |
|
遠離的 |
這可以通過配置系統和env vars進行配置。 |
|
端口 |
工作原理與之前基本相同-如果給定,則是每個主機執行一次任何給定任務的簡寫。 |
|
端口 |
與v1的工作原理相同,包括多次提供構建要嘗試的密鑰列表的能力。 |
|
端口 |
現在 |
|
端口 |
這是現在 |
|
遠離的 |
使用環境變量設置 |
|
還沒有移植。 |
|
|
端口 |
現在有了額外的JSON列表格式!順便說一下,它取代了 |
|
遠離的 |
這并不符合現代命令執行代碼對世界的看法,所以它已經不復存在了。 |
|
還沒有移植。 |
|
|
端口 |
現在是 |
|
遠離的 |
首先,這通常不太安全,現在有許多其他的方法來設置相關的配置值,所以至少現在已經不存在了。 |
|
查看周圍的注釋 |
|
|
遠離的 |
我們的直覺說這最好留給配置系統的env var層,或者使用 |
|
還沒有移植。 |
|
|
如下所述 API組織 ,角色列表僅部分適用于新的API,我們仍在摸索它們是否/如何在全局或CLI級別上工作。 |
|
|
遠離的 |
這在很大程度上被對shell環境變量的新支持所消除(只需做 |
|
遠離的 |
為此,請使用配置系統。 |
|
端口 |
見 |
|
還沒有移植。 |
|
|
遠離的 |
對我們來說,這主要感覺像膨脹,可能需要對重實現進行一些重要的解析器更改,所以現在已經過時了。 |
|
端口 |
這是現在 |
|
Pending 移除 |
這不太可能作為自己的cli標志返回,但它可能作為配置值返回。 |
|
端口 |
這現在是直接傳遞到paramiko級別連接參數的一部分, |
|
見注釋 shell命令執行 (local /運行`/ sudo``) 周圍 |
|
|
遠離的 |
大多數情況下,配置(env vars for true runtime,或例如用戶/項目級的配置文件,視情況而定)都應該用于此目的,但它可能會返回。 |
|
端口 |
照原樣移植,沒有變化。 |
|
尚未移植,正在等待對全局(vs手工實例化)連接/組選擇進行深度重做。 |
|
|
遠離的 |
現在已經沒有工作隊列了,至少現在沒有。不管用什么替代它(除了已經實現的線程模型),看起來都可能大不相同。 |
shell命令執行 (local
/運行`/
sudo``)?
一般?
任何一方共享的行為 run
/sudo
,或全部 run
/sudo
'''本地''。后面的部分按功能差異進行介紹。
|
遠離的 |
所有命令執行現在都是統一的;所有三個函數(現在方法打開 例如,在v1中 |
提示自動響應,通過 |
端口 |
這個 此外, |
|
端口/待機 <https://github.com/fabric/fabric/issues/1752>`__ |
These are now methods on |
|
端口 |
上下文管理器是在任何范圍內設置環境變量的唯一方法;在現代結構中,每個調用都可以控制子進程shell環境(直接在 |
通過操作控制子流程輸出和其他活動顯示文本 |
端口/待機 <https://github.com/pyinvoke/invoke/issues/15>`__ |
“輸出級別”的核心概念已經不復存在,很可能在短期內被輸出級別重新實現得很差的日志模塊(stdlib或其他)所取代。 命令執行方法 |
|
命令超時尚未被移植,但很可能會在將來添加(在調用層)。 |
|
|
端口 |
這已被徹底報告(其行為經常得到改善),包括保存 Fabric0.x和1.x已經改變了這個值;在Fabric1的長生命周期中,很明顯默認值對所有用戶甚至大多數用戶都不起作用,因此我們選擇將默認值返回到 |
|
遠離的 |
這并不十分有用,而且經常導致概念上的問題 我們建議真正需要合并兩個流的用戶,或者在命令中使用shell重定向,或者設置 |
|
端口 |
現在只是 |
|
端口 |
這些是現在 |
|
現有的 |
|
返回值是類似字符串的對象,具有 |
端口 |
返回值不再是類似于字符串的半私有API,而是類型為完全成熟的常規對象 但是,它們仍然表現為布爾值——只是反映出退出代碼與零的關系,而不是是否存在任何stdout。 |
|
端口 |
技術上“刪除”,但只是因為新版本的 |
run
?
|
遠離的 |
非``sudo``遠程執行從來沒有真正需要一個明確的shell包裝器:在幾乎所有情況下,遠程ssh守護進程都將命令字符串交給連接用戶的登錄shell。因為包裝在其他方面非常容易出錯,并且需要令人沮喪的轉義規則,所以我們在這個用例中放棄了它。 查看匹配的行項目 |
sudo
?
除非另有說明,所有常見的 run
+`` sudo``參數/功能(例如 pty
, warn_only
等)在上文的 run
下面是 sudo
具體的。
|
Pending 移除 |
見上文注釋 我們希望升級 |
|
端口 |
這仍然在這里,而且還在叫 |
|
這還沒有預告。 |
local
?
有關新的 local
. 下面是一些具體的附加內容。
|
端口 |
基本上和v1一樣,盡管現在有一些情況 |
公用事業?
錯誤處理通過 |
端口 |
舊的功能在“一切都是DSL”的方向上傾斜得太遠,沒有提供足夠的價值來抵消它如何阻礙有經驗的 Python 。 為了“引發異?!保ㄒ粋€有用的選項是invoke),這些函數已被刪除 |
ANSI顏色助手 |
遠離的 |
似乎沒有必要復制出許多優秀的終端按摩庫中的一個(如描述中所列的庫)。 #101 )在重寫中,我們沒有。 這就是說,我們很有可能在將來出售這樣一個庫來提供內部顏色支持,在這一點上“烘焙”的顏色助手將再次很容易到達。 |
|
端口 |
這是現在 |
|
端口 |
v1需要在你的sphinx構建管道中的某處使用特定于結構的“uncap-tasks”助手函數;現在你可以只啟用新的 invocations.autodoc 擴展列表中的sphinx迷你插件;有關詳細信息,請參見鏈接。 |
|
遠離的 |
與其他與主機字符串相關的工具一樣,這些工具已不復存在,而且毫無用處。 |
|
懸而未決的 |
尚未移植;理想情況下,我們只在invoke中提供第三方lib。 |
|
遠離的 |
沒有為現代結構編寫等效的函數;既然連接/客戶機對象是顯式的,就可以簡單地用相同的參數(如果不想手動調用類似于 如果有足夠的需求,它返回的可能性很??;如果有,它可能是一個更一般的重新連接相關的 |
|
遠離的 |
這還沒有被移植,部分原因是維護人員從未自己使用過它,而且不太可能直接重新實現。但是,其核心用例“需要某些數據可用于運行給定任務”可能會在即將到來的依賴關系框架內返回。 |
|
遠離的 |
喜歡 |
網絡?
|
端口 |
這是現在 (您可以指定運行時,非ssh配置驅動 |
|
端口 |
這和v1一樣繼續工作。 |
|
端口 |
這是現在 |
|
遠離的 |
在v1中,這只是一個(部分實現的)從原來的“任何錯誤都只有sys.exit!”行為?,F代織物明顯更為友好;會引起 |
|
還沒有移植。 |
|
|
還沒有移植。 |
|
|
端口 |
現在可以通過配置系統和直接Kwarg控制 |
認證?
注解
一些 env
v1的鑰匙只是通過帕拉米科的 SSHClient.connect
方法?,F代結構通過 connect_kwargs
configuration 子樹,下表將經常引用這種方法。
|
端口 |
使用 |
|
端口 |
使用 還要注意,這用于執行雙負載連接 and sudo密碼;后者現在位于 |
|
端口 |
使用 |
|
遠離的 |
這已被刪除,因為對Paramiko級別的API進行了不必要的(易出錯)模糊處理;用戶應該已經知道他們正在處理的是哪種類型的密鑰,并實例化一個 |
|
端口 |
將此設置為的用戶 |
|
端口 |
使用 |
|
端口/待機 <https://github.com/fabric/fabric/issues/4>`__ |
各 但是,我們希望用戶可以使用一種更簡單的方法來設置將變為隱式的配置值。 |
配置 |
端口 |
還有一些新的榮譽 |
文件傳輸?
以下功能分解適用于 put
和/或 get
v1的“操作”功能。
傳輸本地和遠程用戶擁有的單個文件 |
端口 |
任何方向的基本文件傳輸都有效,并提供 與v1相比,這些方法的簽名已被清除,盡管它們的位置參數本質 ( |
省略隱式“相對于本地上下文”行為的“destination”參數(例如 |
端口 |
您可能仍然應該是顯式的,因為這是Python。 |
使用任一文件路徑 or 傳輸操作任一側的類似文件的對象(例如上載 |
端口 |
這是一個非常有用且非常簡單的技巧。 |
在目的地保留源文件模式(例如,確保將由目的地的umask刪除的可執行位被重新添加)。 |
端口 |
這不僅是預告,而且現在是默認行為。如果需要,可以通過Kwarg禁用。 |
捆扎 |
遠離的 |
這是v1中最令人討厭的部分之一,而且從來沒有真正做過用戶在后續呼叫中不能做的事情。 如果有足夠多的用戶對它的損失感到擔憂,我們 may 重新考慮一下,但是如果我們這樣做,我們將認真關注簡化和/或不涉及中間文件的方法。 |
遞歸多文件傳輸(例如 |
遠離的 |
這是 另一個 v1最麻煩的部分之一,隨著時間的推移,很明顯它的維護負擔遠遠超過了這一事實:它的重新設計很糟糕。 |
配置?
總的來說,配置已經大大改善了 fabricrc
文件;大多數配置邏輯來自 Invoke's configuration system 它提供了一個完整的配置層次結構(在代碼配置、多個配置文件位置、環境變量、CLI標志等)和多個文件格式。在現代結構中,結構1中的幾乎所有配置通道都變成了配置層次結構中最適合您需要的任何部分的操作。
結構的現代版本只對invoke的設置進行細微的修改(或參數化);請參見 our locally-specific config doc page 有關詳細信息。
注解
確保在本文檔的其他地方查找任何給定v1的詳細信息 env
設置,因為許多已從配置系統外移到對象或方法關鍵字參數中。
修改 |
端口 |
要真正實現全局范圍的配置更改,請使用配置文件、任務集合級別的配置數據或調用shell的環境變量。 |
使本地范圍 |
移植/未決 |
周圍的大多數用例 剩下的這些用例已經變成了 |
ssh配置文件加載(默認關閉,僅限于 |
端口 |
大大改進了:ssh配置文件加載是 on 默認情況下 can be changed )和OpenSSH一樣,加載和合并了多個源,此外還有更多;請參見 ssh-config . 此外,我們還為一些 |
contrib
?
老年人 contrib
模塊表示“最佳實踐”函數,這些函數本身不需要其他結構的核心支持,而是使用用戶可用的相同原語構建的。
在現代結構中,這種責任已經從核心庫轉移到其他獨立的庫中,這些庫具有自己的身份和發布過程,通常是 invocations (不使用ssh的面向本地的代碼)或 patchwork (主要是面向遠程的代碼,盡管沒有顯式地處理連接兩端的任何事情都可以在本地正常工作。)
這些庫仍然在進行中,尤其是因為我們仍然需要找出彌合它們之間差距的最佳方法(因為許多操作本質上不是本地的或遠程的,但可以在任何一端工作)。
由于根據定義,它們是建立在所有用戶可用的核心API之上的,因此它們目前的開發重點較少;用戶總是可以實現自己的版本,而不會犧牲太多(對于核心庫來說,這是不太現實的事情)。一旦核心API穩定下來,我們希望在管理這些集合方面投入更多的工作。
每個單獨塊的詳細信息 fabric.contrib
在下表中:
|
端口 |
搬到 |
|
遠離的 |
我們甚至不確定這本書寫完十年后是否有用,因為從那以后,姜戈肯定發生了很大的變化。如果你正在閱讀,并且對這件事的消失感到悲傷,請告訴我們! |
|
移植/未決 |
這個文件中許多更有用的函數已經移植到 其他,如 |
|
端口 |
現在 |
|
遠離的 |
這似乎不值得移植;“遠程復制本地位”的總體模式已經可以說是一個反模式(vs可重復部署工件,或者至少遠程簽出VCS標簽),而且如果有人走這條路,rsync是一個更明智的選擇。 |
fabric.env
參考?
v1中的許多/大多數成員 fabric.env
在以上每個主題部分都有介紹;任何 not 在別處,住在這里。所有這些都明確指出為 env.<name>
以便在瀏覽器或查看器中搜索。
少數env變量從未公開記錄,因此是隱式私有的;這些變量在這里沒有表示。
|
遠離的 |
當一個概念消失后中止,只需向最終用戶提出任何看起來最合理的異常,或使用 |
|
織物的 但是,該API的詳細信息(例如,通過任務的 |
|
|
參見注釋 |
|
|
端口 |
這是現在 |
|
端口 |
這是現在 請注意,尚未設置此數據的遠程和本地上下文;請參閱有關 |
|
尚未移植,可能會作為角色/主機列表大修的一部分處理。 |
|
|
端口 |
現在是下的配置選項 |
|
遠離的 |
我們不完全確定為什么v1認為這值得在配置中緩存;如果您需要此信息,只需導入并調用 |
|
區分并行stdout/err仍然是一項正在進行的工作;我們可能最終會逐個行地重用日志記錄和前綴(最好是通過實際日志記錄),或者我們可能會嘗試使用更干凈的方法,例如按連接流式傳輸到日志文件。 |
|
|
端口 |
提示自動響應現在公開實現為 |
|
端口 |
加載任務 |
|
移植/移除 |
invoke的中斷捕獲行為當前為“總是將中斷字符發送到子進程并繼續”,允許子進程處理 允許用戶通過config更改此行為還沒有實現,也可能沒有實現,這取決于是否有人需要它——出于向后兼容的原因,它被添加為v1中的一個選項。 技術上也可以通過子類化和重寫來更改中斷行為。 |
|
如中所述 API組織 ,作為一個概念的角色被移植到 我們 may 將其永遠委托給userland,但似乎是一個常見的最佳實踐選項(例如創建 |
|
|
還沒有移植,但應該包括一些可能的小更新 |
|
|
sudo命令構造目前只查看配置中的sudo提示。 |
|
|
端口 |
現在是 |
|
遠離的 |
與其他功能一樣,織物1的“直接跳到 |
|
端口 |
SSH配置加載現在默認處于打開狀態,但仍有一個選項可以禁用它??匆?配置 想要更多。 |
|
遠離的 |
只是 |
示例升級過程?
本節將介紹如何升級一個小型但不平凡的Fabric1FabFile以使用現代Fabric。它并不意味著詳盡,只是說明性的;有關如何升級單個功能或概念的完整列表,請參見 升級詳細信息 .
原始FabFile示例?
以下是Fabric1最終教程片段的副本(稍作修改以符合“現代”Fabric1最佳實踐),我們將使用它作為升級的測試用例:
from fabric.api import abort, env, local, run, settings, task
from fabric.contrib.console import confirm
env.hosts = ['my-server']
@task
def test():
with settings(warn_only=True):
result = local('./manage.py test my_app', capture=True)
if result.failed and not confirm("Tests failed. Continue anyway?"):
abort("Aborting at user request.")
@task
def commit():
local("git add -p && git commit")
@task
def push():
local("git push")
@task
def prepare_deploy():
test()
commit()
push()
@task
def deploy():
code_dir = '/srv/django/myproject'
with settings(warn_only=True):
if run("test -d {}".format(code_dir)).failed:
cmd = "git clone user@vcshost:/path/to/repo/.git {}"
run(cmd.format(code_dir))
with cd(code_dir):
run("git pull")
run("touch app.wsgi")
我們將直接把它移植,這意味著結果仍然是 fabfile.py
不過,我們要注意的是,以一種更面向庫的方式編寫代碼——即使函數沒有被包裝在 @task
-可以使測試和重用代碼更容易。
進口?
在現代結構中,由于強調對象方法而不是全局函數,我們不需要導入幾乎相同的函數。我們只需要以下內容:
Exit
更友好的請求方式sys.exit
;@task
,和以前一樣,但來自invoke,因為它不特定于ssh;confirm
它現在來自調用庫(也不是特定于ssh;盡管調用是fabric.contrib
(不再存在);
from invoke import task, Exit
from invocations.console import confirm
主機列表?
預先定義的全局主機列表的想法已經不復存在;目前沒有直接替換。相反,我們希望用戶設置自己的執行上下文,創建顯式的 fabric.connection.Connection
和/或 fabric.group.Group
對象視需要而定,即使這只是模仿v1內置的“角色”映射。對于簡單的用例, --hosts
核心選項仍然可用。
注解
這是一個正在積極發展的領域,歡迎反饋。
現在,假定源代碼段硬編碼了 my-server
,我們假定將調用此fabfile,例如 fab -H my-server taskname
并且在fabfile本身中沒有硬編碼。
測試任務?
fabfile中的第一個任務使用了API的良好傳播。我們將在這里概述這些更改(不過,所有細節都在 升級詳細信息 ):
將函數聲明為任務與以前幾乎相同,但使用顯式的初始上下文參數,其值將是
fabric.connection.Connection
對象在運行時。使用
with settings(warn_only=True)
可以用一個簡單的木匠來代替local
打電話。那
local
調用現在是對fabric.connection.Connection
,fabric.connection.Connection.local
.capture
不再是一個有用的參數;我們現在可以在本地或遠程同時捕獲和顯示。如果你不是真的 want 本地子進程在運行時鏡像其stdout/err,您可以簡單地說hide=True
(或)hide='stdout'
等等)結果對象在不同版本之間非常相似;現代結構的結果不再假裝是“be”字符串,而是更像布爾值,如果命令干凈地退出,則表現為真實,否則則為虛假。就所展示的屬性而言,大多數相同的信息都是可用的,而且更多。
abort
不見了;你應該使用你認為合適的例外,或者Exit
對于一個sys.exit
當量。(或者只是打電話sys.exit
如果您不想問任何問題,請立即退出,即使是我們的CLI機器也不會接觸。)
結果:
@task
def test(c):
result = c.local('./manage.py test my_app', warn=True)
if not result and not confirm("Tests failed. Continue anyway?"):
raise Exit("Aborting at user request.")
其他簡單任務?
接下來的兩個任務是簡單的一行程序,您已經看到了什么取代了全球 local
功能:
@task
def commit(c):
c.local("git add -p && git commit")
@task
def push(c):
c.local("git push")
從其他任務調用任務?
這是另一個在調用級別處于不斷變化中的領域,但是現在,我們可以簡單地將其他任務作為函數調用,就像在v1中所做的那樣。主要區別在于,我們希望傳遞上下文對象以保留配置上下文(如加載的配置文件或CLI標志)::
@task
def prepare_deploy(c):
test(c)
commit(c)
push(c)
實際遠程步驟?
請注意,到目前為止,還沒有真正與織物有關的東西發揮作用。- fabric.connection.Connection.local
只是重新綁定 Context.run
,調用的本地子進程執行方法?,F在我們進入實際的部署步驟,它調用 fabric.connection.Connection.run
相反,遠程執行(在 fabric.connection.Connection
已綁定到)。
with cd
還沒有完全實現遠程方面的事情,但我們預計很快就會實現?,F在我們回到命令鏈 &&
.
@task
def deploy(c):
code_dir = '/srv/django/myproject'
if not c.run("test -d {}".format(code_dir), warn=True):
cmd = "git clone user@vcshost:/path/to/repo/.git {}"
c.run(cmd.format(code_dir))
c.run("cd {} && git pull".format(code_dir))
c.run("cd {} && touch app.wsgi".format(code_dir))
整件事?
現在我們有了整個升級后的FabFile,它將與現代 Fabric 一起使用:
from invoke import task, Exit
from invocations.console import confirm
@task
def test(c):
result = c.local('./manage.py test my_app', warn=True)
if not result and not confirm("Tests failed. Continue anyway?"):
raise Exit("Aborting at user request.")
@task
def commit(c):
c.local("git add -p && git commit")
@task
def push(c):
c.local("git push")
@task
def prepare_deploy(c):
test(c)
commit(c)
push(c)
@task
def deploy(c):
code_dir = '/srv/django/myproject'
if not c.run("test -d {}".format(code_dir), warn=True):
cmd = "git clone user@vcshost:/path/to/repo/.git {}"
c.run(cmd.format(code_dir))
c.run("cd {} && git pull".format(code_dir))
c.run("cd {} && touch app.wsgi".format(code_dir))