fabric与alfred的结合使用案例

安装 Pyenv-Python版本管理神器

删除自己手动安装的python

一般我们手动安装就是从python官网下载:

https://www.python.org/downloads/

下载python3.7.0,安装python3.7.

不过对于删除 Python,我们首先要知道其具体都安装了什么,实际上,在安装 Python 时,其自动生成:

  • Python.framework目录;例如:/Library/Frameworks/Python.framework
  • Python 应用目录;例如:/Applications/Python x.x
  • 指向 Python 的连接。

对于 Mac 自带的 Python,其框架目录为:

  • System/Library/Frameworks/Python.framework

而用户安装的 Python,其(默认)框架目录为:

  • /Library/Frameworks/Python.framework
python_install_dir

接下来,我们就分别(在 Mac 终端进行)删除上面所提到的三部分,删除用户安装的python,系统的python别随便删除了,可能系统某个组件要用到呢。

第 1 步,删除用户安装的框架

  • sudo rm -rf /Library/Frameworks/Python.framework/Versions/x.x

第 2步,删除应用目录

  • sudo rm -rf "/Applications/Python x.x"

第 3 步,删除指向 Python 的连接

cd /usr/local/bin/
ls -l /usr/local/bin | grep '../Library/Frameworks/Python.framework/Versions/x.x' | awk '{print $9}' | tr -d @ | xargs rm12

至此,我们已经成功删除 Python 的相关文件,其中x.x为 Python 的版本号。

安装pyenv

安装pyenv,一个可以任意切换python版本的工具,建议安装之前,按照如上可以把自己安装的python都卸载掉

我用的是mac,安装就简单很多,直接使用Homebrew:

$ brew update
$ brew install pyenv
$ brew install virtualenv (可选装,这个是创建虚拟环境使用的)
$ pyenv --version
pyenv 1.2.7
# checkout pyenv到pyenv安装的路径下
$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv
# 在~/.bash_profile定义PYENV_ROOT 环境变量
·········edit·~/.bash_profile··············
# Define environment variable PYENV_ROOT
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
if command -v pyenv 1>/dev/null 2>&1; then
  eval "$(pyenv init -)"
fi
········································
# 使用pyenv commands可以查看所有pyenv命令
$ pyenv commands
--version
activate
commands
completions
deactivate
...

配置pyenv自动补全

$ source $(pyenv root)/pyenv/completions/pyenv.bash

安装python

$ pyenv install -l # 查看可用的python版本
$ pyenv install <version> # 安装版本号为<version>的Python
$ pyenv uninstall <version> #卸载版本号为<version>的Python

查看已安装Python版本

比如我安装了,python2.7,3.7.0,3.5.2

$ pyenv versions
  system
  2.7
  3.5.2
* 3.7.0 (set by /Users/che/.pyenv/version)

Python 版本管理

$ pyenv global <version>  # 全局设置python版本为指定版本,设置全局的 Python 版本,通过将版本号写入 ~/.pyenv/version (如果没有会自动创建)文件的方式。
$ pyenv local <version>   # 设置当前路径下python版本为指定版本,设置 Python 本地版本,通过将版本号写入当前目录下的 .python-version 文件(会自动创建)的方式。通过这种方式设置的 Python 版本优先级较 global 高。
$ pyenv shell <version>   # 设置当前shell窗口使用的python版本为指定版本,设置面向 shell 的 Python 版本,通过设置当前 shell 的 PYENV_VERSION 环境变量的方式。这个版本的优先级比 local 和 global 都要高。–unset 参数可以用于取消当前 shell 设定的版本。
Python版本的优先级
shell > local > global

pyenv会从当前目录开始向上逐级查找.python-version文件,直到根目录为止,若找不到,则使用global版本。
$ pyenv rehash  # 创建垫片路径(为所有已安装的可执行文件创建 shims,如:~/.pyenv/versions/*/bin/*,因此,每当你增删了 Python 版本或带有可执行文件的包(如 pip)以后,都应该执行一次本命令)

到目前为止python已经安装完全。也大概了解了pyenv的使用方式。接下来我们就来安装fabric

安装fabric

由于fabric强烈依赖于python,所有我们把python环境弄好,相当于完成了1/4。

把python version切换到2.7

$ pyenv global 2.7
$ pip install fabric==1.14.0 

fabric2 慎入,下面是安装fabric2的安装流程,但是新版本fabric玩不起…太危险...里面很多功能和fabric1的区别很大,很多命令都不一样。

把python version切换到3.7.0

$ brew update
$ pip install invoke
$ pip install paramiko
# brew reinstall openssl (如果出现openssl的问题,可以重装试下)
$ pip install fabric2
$ fab2 --version
Fabric 2.3.1
Paramiko 2.4.1
Invoke 1.1.1
$ python
Python 3.7.0 (default, Aug 23 2018, 12:47:24)
[Clang 9.1.0 (clang-902.0.39.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from fabric import Connection   (官网的第一句都执行出错...)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'fabric'
>>>

算了(liao)算了(liao),哪位勇士敢于人先,成功了,记得告诉我。

Hello Fabric

在工作目录中创建一下==fabfile.py==模块文件中

然后向其中添加如下代码

def hello():
    print("Hello world!")

接着执行

$ fab hello
Hello world!

Done.

以上就是配置文件的全部。它基于 Fabric 实现了一个(极其)简单的构建工具,简单到甚至不用导入任何 Fabric API。

简单的栗子

1.在~/Documents/fabric目录下创建一个testdir目录

2.在~/Documents/fabric目录下创建一个fabfile.py

from fabric.api import local,lcd

def clone():
    local("git clone https://github.com/CNiceToUpp/xcode_tool.git")

def commit():
    local("echo 'hello fabric' >> test.file")        <== the changes
    local("git add . && git commit -m 'add test.file'")

def push():
    local("git push")

def prepare_deploy():
    with lcd("~/Documents/fabric/testdir"):
        clone()
    with lcd("~/Documents/fabric/testdir/xcode_tool"):
        commit()
        push()

3.在~/Documents/fabric目录下运行==fab prepare_deploy==

$ fab prepare_deploy
[localhost] local: git clone https://github.com/CNiceToUpp/xcode_tool.git
Cloning into 'xcode_tool'...
remote: Counting objects: 44, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 44 (delta 0), reused 2 (delta 0), pack-reused 40
Unpacking objects: 100% (44/44), done.
[localhost] local: echo 'hello fabric' >> test.file
[localhost] local: git add . && git commit -m 'add test.file'
[master 42b13af] add test.file
 1 file changed, 1 insertion(+)
[localhost] local: git push
Counting objects: 3, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 265 bytes | 265.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
To https://github.com/CNiceToUpp/xcode_tool.git
   01cb01e..42b13af  master -> master

Done.
$ tree . -L 2
.
├── fabfile.py
├── fabfile.pyc
└── testdir
    └── xcode_tool

Ok,栗子展示成功。

fabric高级功能

上面的栗子已经教会了如何使用基本的fabric功能

具体的高级功能参考这里

fabric高级功能栗子

deploy task完成一个git clone , 修改文件,git add . ,git commit ,git push 等一系列操作,并且deploy task会在'root@serverip1','cnicetoupp@serverip2','cnicetoupp@serverip3','cnicetoupp@serverip4' 中进行。本来是可以进行并行操作的,但是考虑到在不同机器上git pull ,git push ,会导致冲突,所以改成了串行的了。

在运行之前,要先做好对这些机器ssh免密登录。

在本机运行==ssh-keygen -t rsa==命令。接着全部按回车键,即生成密钥。

之后通过==ssh-copy-id -i ~/.ssh/id_rsa.pub remote_ip==把本机的公钥放到远程机器的authorized_keys.

$ ssh-keygen -t rsa
$ ssh-copy-id -i ~/.ssh/id_rsa.pub remote_ip

当然,远程机器必须也要有git环境,并且最好git 也能免密

在远程机器的~/.gitconfig中添加如下,则所有的git repo都在登录一次之后将免密。

[credential]
    helper = store

如果只对某一个repo实现免密,可在repodir/.git/config文件中配置如上。

fabric.py

from __future__ import with_statement
# 这个栗子所使用到的工具类
from fabric.api import run,cd,hosts,settings,env,parallel
from fabric.contrib.console import confirm
from fabric.colors import *


def clone():
    with settings(warn_only=True):
        if run("git clone https://github.com/CNiceToUpp/xcode_tool.git").failed:
            print(red("clone failed"))
        else:
            print(green("clone successfully"))

def commit():
    with settings(warn_only=True):
        run("echo 'hello fabric' >> test.file")
        if run("git add . && git commit -m 'add test.file'").failed:
            print(red("commit failed"))
        else:
            print(green("commit successfully"))

def push():
    with settings(warn_only=True):
        if run("git push").failed:
            print(red("push failed"))
        else:
            print(green("push successfully"))

@hosts('root@serverip1','cnicetoupp@serverip2','cnicetoupp@serverip3','cnicetoupp@serverip4')
# @parallel ## 并行执行task 不过在这里并不适用,因为在不同的host同时push,会导致在pull的时候出现conficts.
def deploy():
    code_dir = '~/Documents/fabric'
    with settings(warn_only=True):
        if run("test -d %s" % code_dir).failed:
            run("mkdir -p %s" %  code_dir)
    with cd("~/Documents/fabric/"),settings(warn_only=True):
        if run("test -d %s" % code_dir).failed:
            clone()
    with cd("~/Documents/fabric/xcode_tool"):
        commit()
        push()

alfred + fabric

在这里,还可以使用alfred更快捷的触发命令。在这里创建一个workflow

alfred_workflow

输入为:List Filter

listfilter

触发fab deploy操作为:Run Script

runscript

输出为2个,一个是将输出写入到一个文件中,一个是post Notification

write to Post Notification

postnotification

write to file

writetofile

操作流程大概是如下:

alfred_fabric

输出结果为一mac系统通知和一个输出文件alfred_fabric_output.log。

总结

pyenvfabricalfred都是提高工作效率的小工具,利用好的话,能大大简化工作流程。除了pyenv,还有jenvscalaenv等等语言管理工具。这里只是做了简单的使用介绍,通过扩展可以将其中的原理应用到自己的工作中,把一些重复,无效的工作写进脚本中,通过alfred一键部署。这也是写这篇文章的目的。

参考

https://www.zhihu.com/question/30941329

https://github.com/pyenv/pyenv (pyenv github 1w多星,可显示它的强大)

https://fabric-chs.readthedocs.io/zh_CN/chs/tutorial.html(fabric1.X)

我的微信号,交流技术,永无止境

究极饭团
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354