日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > > HelloGitHub


一、前言

在前面三篇介紹 fire的文章中,我們?nèi)媪私饬?fire強大而不失簡潔的能力。按照慣例,我們要像使用 argparse、docopt和 click一樣使用 fire來實現(xiàn) git 命令。

本文的關(guān)注點并不在 git的各種命令是如何實現(xiàn)的,而是怎么使用 fire去打造一個實用命令行程序,代碼結(jié)構(gòu)是怎樣的。因此,和 git相關(guān)的操作,將會使用 gitpython庫來簡單實現(xiàn)。

為了讓沒讀過 使用 xxx 實現(xiàn) git 命令(xxx指 argparse、docopt和 click) 的小伙伴也能讀明白本文,我們?nèi)詴?git常用命令和 gitpython做一個簡單介紹。

本系列文章默認使用 Python 3 作為解釋器進行講解。
若你仍在使用 Python 2,請注意兩者之間語法和庫的使用差異哦~

二、git 常用命令

當你寫好一段代碼或增刪一些文件后,會用如下命令查看文件狀態(tài):

git status

確認文件狀態(tài)后,會用如下命令將的一個或多個文件(夾)添加到暫存區(qū):

git add [pathspec [pathspec ...]]

然后使用如下命令提交信息:

git commit -m "your commit message" 

最后使用如下命令將提交推送到遠程倉庫:

git push

我們將使用 fire和 gitpython庫來實現(xiàn)這 4 個子命令。

三、關(guān)于 gitpython

gitpython[1] 是一個和 git倉庫交互的 Python 第三方庫。我們將借用它的能力來實現(xiàn)真正的 git邏輯。

安裝:

pip install gitpython

四、思考

在實現(xiàn)前,我們不妨先思考下會用到 fire的哪些功能?整個程序的結(jié)構(gòu)是怎樣的?

fire

git的 4 個子命令的實現(xiàn)其實對應(yīng)于四個函數(shù),我們可以都放到一個類中,實現(xiàn)四個實例方法。而對于 git add命令,需要接受任意個參數(shù),在實例方法中用 *pathspecs參數(shù)來表達。對于 git commit命令,需要接受 -m選項,在實例方法中用 m參數(shù)來表達。

程序結(jié)構(gòu)

程序結(jié)構(gòu)上:

  • 實例化 Git對象,供全局使用
  • GitCli類中定義四個命令對應(yīng)的實例方法 status、add、commit、push

則基本結(jié)構(gòu)如下:

import os import fire from git.cmd import Git

git = Git(os.getcwd()) class GitCli: def status(self): """
        處理 status 命令
        """ pass def add(self, *pathspecs): """
        處理 add 命令
        """ pass def commit(self, m): """
        處理 -m命令
        """ pass def push(self): """
        處理 push 命令
        """ pass if __name__ == '__main__':
    fire.Fire(GitCli())

下面我們將一步步地實現(xiàn)我們的 git程序。

五、實現(xiàn)

假定我們在 fire-git.py[2] 文件中實現(xiàn)我們的 git程序。

5.1 status 子命令

status子命令不接受任何參數(shù)和選項,因此 status方法無需任何入?yún)ⅰ?

class GitCli: def status(self): """
        處理 status 命令
        """ cmd = ['git', 'status']
        output = git.execute(cmd) return output

不難看出,我們最后調(diào)用了真正的 git status來實現(xiàn),并打印了輸出。

5.2 add 子命令

add子命令相對于 status子命令,需要接受任意個 pathspec 參數(shù),因此 add方法需要增加 *pathspecs入?yún)?。fire 最終傳入的是一個元組,我們需要將其轉(zhuǎn)換成 list 以便后續(xù)處理。

class GitCli: def add(self, *pathspecs): """
        處理 add 命令
        """ cmd = ['git', 'add'] + list(pathspecs)
        output = git.execute(cmd) return output

當我們執(zhí)行 python3 fire-git.py add --help時,結(jié)果如下:

INFO: Showing help with the command 'fire-git.py add -- --help'.

NAME
    fire-git.py add - 處理 add 命令

SYNOPSIS
    fire-git.py add [PATHSPECS]...

DESCRIPTION
    處理 add 命令

POSITIONAL ARGUMENTS
    PATHSPECS

5.3 commit 子命令

commit子命令相對于 status子命令,需要接受 -m選項,因此 commit方法需要增加 m入?yún)ⅰ?

class GitCli: def commit(self, m): """
        處理 -m命令
        """ cmd = ['git', 'commit', '-m', m]
        output = git.execute(cmd) return output

5.4 push 子命令

push子命令同 status子命令一樣,不接受任何參數(shù)和選項,因此 push方法無需任何入?yún)ⅰ?

class GitCli: def push(self): """
        處理 push 命令
        """ cmd = ['git', 'push']
        output = git.execute(cmd) return output

至此,我們就實現(xiàn)了一個簡單的 git命令行,使用 python fire-git.py status便可查詢項目狀態(tài)。

非常方便的是,每個命令函數(shù)的 docstring都將作為這個命令的幫助信息,因此,當我們執(zhí)行 python3 fire-git.py --help會自動生成如下幫助內(nèi)容:

INFO: Showing help with the command 'fire-git.py -- --help'.

NAME
    fire-git.py

SYNOPSIS
    fire-git.py COMMAND

COMMANDS
    COMMAND is one of the following:

     add
       處理 add 命令

     commit
       處理 -m命令

     push
       處理 push 命令

     status
       處理 status 命令

想看整個源碼,請戳 fire-git.py[3] 。

六、小結(jié)

本文簡單介紹了日常工作中常用的 git命令,然后提出實現(xiàn)它的思路,最終一步步地使用 fire和 gitpython實現(xiàn)了 git程序。

對比 argparse、docopt和 click的實現(xiàn)版本,你會發(fā)現(xiàn)使用 fire來實現(xiàn)是最簡單的:

  • 相較于 argparse,子解析器、參數(shù)類型什么的統(tǒng)統(tǒng)不需要關(guān)心
  • 相較于 docopt,參數(shù)解析和命令調(diào)用處理也不需要關(guān)心
  • 相較于 click,裝飾器所定義的命令行參數(shù)信息也必須要關(guān)心

無疑,fire把能簡化的都簡化了,簡直就是懶人福音。

關(guān)于 fire的講解將告一段落,回顧下 fire的至簡之道,你會深愛上它。這也體現(xiàn)出了 Python 之美。

現(xiàn)在,你已學(xué)會了四個特點各異的主流命令行解析庫的使用了,再也不需要為命令行程序的實現(xiàn)而煩惱了。

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
關(guān)閉