手把手教你组件化开发Python命令行工具

作为研发,如果你想提高开发效率、解放生产力、CI/CD,一定离不开脚本。随着功能不断完善,脚本体量越来越大,统一一门脚本语言,解耦复用模块,组件化开发脚本变得更加重要。

所以,统一持续使用一门合适的脚本语言是非常有必要的。

作为移动端研发,我推荐使用Python,相比Shell,Ruby,Gradle,JS,Swift等等,优势如下:

  1. 入门简单,社区庞大,生态完善,很多坑别人都踩过,很多功能都有人实现过(这点很重要,不然你可能会因为一些大坑带来的挫败感停滞不前);
  2. 各端都有各自常用的脚本语言,而Python貌似更加的平台不相关,开发多端复用的工具也许Python更合适;
  3. 应用广泛,也许你后期可以拓展学习人工智能,大数据等;

下面详细介绍下组件化开发一套Python命令行工具需要用到的工具链及相关配置。(本文以MacOS为例)

安装Python3.x

Mac系统自带Python,可能会被系统工具依赖,如果玩坏了影响范围较大。一般版本较旧,且不方便管理,这里我建议自己再安装一套,推荐用Homebrew安装。(或者[官网下载](https://www.python.org/)

shell
复制代码
# 安装3.x版本 
brew install python3 
# 系统自带的Python在 /usr/bin/python3 
# 使用Homebrew安装的Python一般在 /usr/local/bin/python3 
# 查看安装位置,安装后会打印brew安装的路径 
which python3 
# python包管理工具,下面介绍 
which pip3 

# 如果路径不对,一般是PATH没有记录新路径,添加一下即可 
echo $PATH 
# 卸载 
brew uninstall python3

关于pip3

类似iOS的Cocoapods,Java的Maven,前端的npm,pip3是官方自带的包管理工具,从PyPI或私有源上你可以轻松找到可供你使用的轮子(以下都称package)。

shell
复制代码
# 下载package 
python3 -m pip install <package> 
# 或者 
pip3 install <package> 

# 查看已安装package 
pip3 show <package> 
# 查看下载到本地的所有package 
pip3 list [-v] 

# 卸载 
pip3 uninstall <package>

关于pip3导入包的作用域

全局作用域

一般来说,pip3 install默认导入到全局作用域,即模块导入到/usr/local/lib/python3.x/site-packages路径下,可执行文件导入到/usr/local/bin/。

在系统目录下,可被所有用户共享。

用户作用域

添加–user选项,导入到用户作用域,即模块导入到/Users/lyon/Library/Python/3.x/ lib/python/site-packages,可执行文件导入到/Users/lyon/Library/Python/3.11/bin/。

在当前用户目录下,不可被其他用户共享。

注:/Users/lyon/Library/此路径一般不在环境变量PATH中,也就是说,如果pip3 install导入到用户作用域下可能因命令不可见导致调用失败。

安装pipx

pip3安装package以用户为最小隔离单位,即同一个用户安装的package在同一目录下。而且不支持同一个package的多版本共存,如果用户开发或使用的多个工程(以下称applicationorapp)依赖的同一个package版本冲突时将无法解决。

pipx是python package,封装并优化了pip的安装逻辑,对多个app依赖的packages隔离管理,解决了上述问题。

shell
复制代码
# 安装 
brew install pipx 
# 添加pipx的工作目录到PATH变量中 
pipx ensurepath

安装poetry

pip3/pipx准确说是针对工具使用者的包管理工具,比如要下载名为AppUploader的工具,使用者通过pip install安装时会自动下载该工具依赖的packages。

对于工具开发者,至少需要添加及管理依赖、隔离开发和生产环境、配置命令行入口的功能,可选工具有PipenvvenvsetuptoolsPoetry等,这些工具也都可以看作是对pip功能的封装。

推荐poetry,提供了从开发、依赖、编译、发布一整套的工程化解决方案,相比setuptools使用体验更好。

shell
复制代码
# 安装 
pipx install poetry 
# 创建新工程 
poetry new YOUR_PROJ_NAME 
# 初始化已有工程 
poetry init 
# 添加依赖 
poetry add requests 
# 导入/对齐依赖 
poetry install 
# 更新依赖 
poetry update requests 
# 激活虚环境(追加PATH,覆盖生产环境目录) 
poetry shell

poetry初始化之后,主要配置pyproject.toml文件,样例如下:

toml
复制代码
[tool.poetry]
name = "metis-ios-workflow"
version = "1.0.2"
description = "CLI tools for Metis."
authors = ["xxx"]
readme = "README.md"
packages = [
    {include = "metis_ios_workflow", from = "src"},
]
license = "MIT"
homepage = "xxx"

[tool.poetry.scripts]
metis = "metis_ios_workflow.cli.entry:metis"

[tool.poetry.dependencies]
python = "^3.11"
requests = "^2.31.0"
jira = {version = "^3.5.2", extras = ["cli"]}
appstoreconnect = {git = "https://github.com/xxx/xxx.git", branch = "xxx"}

[tool.poetry.group.dev.dependencies]
flake8 = "^6.0.0"
flake8-quotes = "*"

[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"

代码风格检查

主流的代码风格检查工具有flake8blackisort,其中black和isort提供格式化代码的入口。

关于代码风格建议详见《PEP 8 – Style Guide for Python Code》,根据规范制定的错误码详见pycodestyle

shell
复制代码
# 安装(仅开发环境) 
poetry add flake8 isort black --group=dev

安装及配置pre-commit

pre-commit可以集中管理git hooks各个阶段的脚本,并且提供丰富的插件及自定义插件的能力,flake8和isort均提供了相关插件,代码检查时机可通过配置pre-commit完成,在git pre-commit时自动检查,检查不通过则commit失败。

shell
复制代码
# step1:安装 
pipx install pre-commit 
# step2:通过`.pre-commit-config.yaml`配置pre-commit(git仓库根目录) 
# step3:导入git hook插件(git仓库根目录执行) 
pre-commit install

其中.pre-commit-config.yaml文件配置如下:

yaml
复制代码
repos:
  - repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v4.2.0
    hooks:
      - id: end-of-file-fixer
      - id: trailing-whitespace
  - repo: https://github.com/pycqa/flake8
    rev: 4.0.1
    hooks:
      - id: flake8
        additional_dependencies: [flake8_commas, flake8_quotes]
  - repo: https://github.com/pycqa/isort
    rev: 5.12.0
    hooks:
      - id: isort

安装及配置PyCharm CE

相比VSCode,PyCharm默认集成了代码提示,风格检查,查看API,Debug工具,自动导入poetry依赖,自动激活虚环境等一系列强大功能,而且与IDEA交互风格非常相似,熟悉以上IDE的研发可以无缝切换,推荐使用PyCharm。

JetBrains推出了很多优秀的开发工具,其中IDEA、WebStorm等是目前业内最受欢迎的IDE,PyCharm是旗下专业的Python IDE,可以下载社区免费版

自动格式化代码

“cmd+,”进入偏好设置,找到External Tools,点击+号,这里分别添加black和isort外部工具。

企业微信截图_6659c89b-5784-47d4-9e42-49997a96e67b.png

black配置如下,其中:

$PyInterpreterDirectory$是python3解释器路径,在poetry虚环境下即是其可执行文件目录,确保black cli在此目录下即可。

$FilePath$是当前选中的文件/目录,作为black cli入参,指定需要格式化的文件/目录。

企业微信截图_22b2bb0c-3291-4928-a37f-25b3ee2ceeb0.png

isort配置如下:

截图.png

选中文件/目录后,可在菜单栏中点击调用对应的命令完成代码格式化。

截图.png

也可以如下配置快捷键。(或者监听文件变化自动执行,参考:Automate linting & formatting in PyCharm with your favourite tools

截图.png

定制命令入口

对于一套功能较复杂的CLI,如git命令,以git [options] <command> [<args>]的形式组合了clone/commit/push等功能,方便统一查看帮助信息,也可以结构化复用相关参数,需要定制层级分明、可组合式的命令行入口。

推荐使用click三方库辅助设计,通过poetry add click安装。

定制一套形如metis <command> <subcommand> [<args>]的CLI,可如下设计:

metis作为命令入口,添加各子功能模块。

python
复制代码
import click

from metis_ios_workflow.cli.cmds.app import app
from metis_ios_workflow.cli.cmds.gitlab import gitlab
from metis_ios_workflow.cli.cmds.jira import jira
from metis_ios_workflow.cli.cmds.notify import notify
from metis_ios_workflow.cli.cmds.pod import pod
from metis_ios_workflow.cli.cmds.release import release
from metis_ios_workflow.cli.cmds.scrum import scrum
from metis_ios_workflow.cli.cmds.sentry import sentry
from metis_ios_workflow.cli.cmds.xcrc import xcrc

CONTEXT_SETTINGS = {"help_option_names": ["-h", "--help"]}


@click.group(context_settings=CONTEXT_SETTINGS)
@click.version_option(None, "-v", "-V", "--version")
def metis():
    pass

metis.add_command(app)
metis.add_command(notify)
metis.add_command(release)
metis.add_command(jira)
metis.add_command(gitlab)
metis.add_command(scrum)
metis.add_command(pod)
metis.add_command(sentry)
metis.add_command(xcrc)

metis release pre-release命令为例,将pre-release命令添加到release组下。

python
复制代码
import click

from metis_ios_workflow.app_release_assist.app_review_monitor import app_review_monitor
from metis_ios_workflow.app_release_assist.post_build import post_build_cli
from metis_ios_workflow.app_release_assist.post_release import post_release_cli
from metis_ios_workflow.app_release_assist.pre_release import pre_release_cli
from metis_ios_workflow.utils.macro import BuildConfiguration


@click.group(help="发版助手")
def release():
    pass
    
    
@release.command(help="「预发版」任务处理")
@click.option("--target_list", type=click.STRING, required=True, help="App Target列表,以,间隔")
@click.option("-v", "--version", type=click.STRING, required=True, help="App三位版本号")
@click.option(
    "--ref",
    type=click.STRING,
    required=False,
    help="设置从特定的ref(branch/tag/commitSHA)开分支,不传时默认从master分支的最新提交开分支",
)
@click.option(
    "--pbxproj_path",
    type=click.STRING,
    required=True,
    help="project.pbxproj文件路径,用于自动更新对应App的版本号",
)
def pre_release(target_list, version, ref, pbxproj_path):
    pre_release_cli(target_list, version, ref, pbxproj_path)

使用者角度可以明确metis工具集的功能范围及使用介绍。

shell
复制代码
metis --help
                
Usage: metis [OPTIONS] COMMAND [ARGS]...

Options:
  -v, -V, --version  Show the version and exit.
  -h, --help         Show this message and exit.

Commands:
  app      app相关工具
  gitlab   gitlab工具
  jira     jira工具
  notify   企微通知工具
  pod      Cocoapods工具
  release  发版助手
  scrum    scrum助手
  sentry   sentry工具
  xcrc     XCRemoteCache相关

命令入参详细介绍。

shell
复制代码
metis release pre-release --help

Usage: metis release pre-release [OPTIONS]

  「预发版」任务处理

Options:
  --target_list TEXT   App Target列表,以,间隔  [required]
  -v, --version TEXT   App三位版本号  [required]
  --ref TEXT           设置从特定的ref(branch/tag/commitSHA)开分支,不传时默认从master分支的最新提交开
                       分支
  --pbxproj_path TEXT  project.pbxproj文件路径,用于自动更新对应App的版本号  [required]
  -h, --help           Show this message and exit.

发布

发布渠道有三种:PyPI、私有源、git仓库,对应使用方三种安装方式。

shell
复制代码
# PyPI
# 发布
poetry publish
# 安装
pip3 install <PACKAGE_NAME>

# 私有源
# 首次需配置私有源
poetry config repo.REPO_NAME REPO_INDEX_URL
# 发布
poetry publish --repository=<REPO_NAME>
# 安装
pip3 install <PACKAGE_NAME> --extra-index-url <REPO_INDEX_URL> --trusted-host <DOMAIN_OF_REPO_INDEX_URL>

# Git仓库
# 发布:提交到远端分支即视为发布
# 安装
pip3 install git+ssh://git@github.com/xxx/xxx.git@BRANCH_NAME

总结

  1. 安装Python3开发包;
  2. pipx:隔离依赖packages,避免版本冲突;
  3. poetry:适用开发者的工程配置、依赖管理工具集;
  4. 代码风格检查:flake8/black/isort + pre-commit,自动执行代码检查;
  5. PyCharm:自带完善功能的IDE,配置自动格式化代码;
  6. click:三方开发库,定制可组合式的命令行工具集;
  7. 三种发布及安装方式;

以上是组件化开发一套命令行工具,需要使用的工具链及配置。

工欲善其事必先利其器,也许你实现过以调用py文件的方式执行脚本,不过随着功能逐渐完善,脚本文件逐渐增多,建立一套相对规范的组件化工程将助力你更高效开发高可用的工具集。

题外话

在此疾速成长的科技元年,编程就像是许多人通往无限可能世界的门票。而在编程语言的明星阵容中,Python就像是那位独领风 骚的超级巨星, 以其简洁易懂的语法和强大的功能,脱颖而出,成为全球最炙手可热的编程语言之一。


Python 的迅速崛起对整个行业来说都是极其有利的 ,但“人红是非多”,导致它平添了许许多多的批评,不过依旧挡不住它火爆的发展势头。

在下个十年的剩余时间里,Python 还能如此重要以及保持完整性吗?今天,我们将对事实进行分析,破除一些误解。

CSDN大礼包:全网最全《全套Python学习资料》免费分享🎁

😝朋友们如果有需要的话,可以扫描下方二维码免费领取🆓

如果你对Python感兴趣,想通过学习Python获取更高的薪资,那下面这套Python学习资料一定对你有用!

资料包括:Python安装包+激活码、Python web开发,Python爬虫,Python数据分析,人工智能、机器学习等学习教程。0基础小白也能听懂、看懂,跟着教程走,带你从零基础系统性地学好Python!



这份完整版的Python全套学习资料已经打包好,需要的小伙伴可以戳下方链接免费领取

读者福利《Python全套学习资料》,戳这里免费领取!!!

一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述
二、Python学习软件

工欲善其事,必先利其器。学习Python常用的开发软件都在这里了!
在这里插入图片描述
三、Python入门学习视频

还有很多适合0基础入门的学习视频,有了这些视频,轻轻松松上手Python~在这里插入图片描述

四、Python练习题

每节视频课后,都有对应的练习题哦,可以检验学习成果哈哈!
在这里插入图片描述

五、Python实战案例

光学理论是没用的,要学会跟着一起敲代码,动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。这份资料也包含在内的哈~在这里插入图片描述

六、Python面试资料

我们学会了Python之后,有了技能就可以出去找工作啦!下面这些面试题是都来自阿里、腾讯、字节等一线互联网大厂,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
在这里插入图片描述
在这里插入图片描述
七、资料领取

上述完整版Python全套学习资料已经上传CSDN官方,需要的小伙伴可自行微信扫描下方CSDN官方认证二维码免费领取

这份完整版的Python全套学习资料已经打包好,需要的小伙伴可以戳下方链接免费领取

读者福利《Python全套学习资料》,戳这里免费领取!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值