Mac 开发工具信息的备份
相信大部分程序员都对开发环境的工具都有一些特殊的执念(???),如果在自己不习惯的环境中工作完全无法开展,怎么这个工具没有那个字体难受,我本人就是,换了新的 Mac 电脑后如何快速恢复到之前的开发工具呢?
开发工具包括 App 和命令行工具。用移动硬盘+时间机器自动备份当然能够完美地解决备份和恢复问题,不过接下来讨论的是一种用 Python 实现的“便宜的”方案。
App 信息备份
对于 App Store 安装的 App,通过 Apple ID 可以方便地重新下载,而对于非 App Store 安装的小众 App(如通过 Git Release)怎么快速恢复?通过 homebrew、gem 安装的依赖包和小工具呢?如果不是高频使用的 App,我们大多也记不住名字,只有到使用时才能想起它。下面介绍我使用 Python 编写程序备份 App 信息,并定期自动发送到邮件。
- 实现思路
Mac OS 的/Applications文件夹中,保存了从 App Store 下载的 App,我们其他途径得到的.dmg等安装包也会引导我们将 App 安装到/Applications中,每一个 App 对应一个.app后缀名的文件夹,右键选择任一个 App -> 显示包内容打开文件夹,打开Contents/Info.plist,该 Info.plist 记录了 App 的名字、开发者、Bundle ID、版本信息,我们备份了这些信息,在需要时 就能准确地在 Git 重新搜索到该 App。如下是 Python 实现
class AppInfo():
def __init__(self,name,version,bundleid,folder):
self.name = name
self.version = version
self.bundleid = bundleid
self.folder = folder
def __str__(self):
return "<td>{3}</td>\n\t<td>{0}</td>\n\t<td>{1}</td>\n\t<td>{2}</td>".format(self.name,self.version,self.bundleid,self.folder)
def application_list():
app_folder = "/Applications"
def pharse_plist(path_dir,path_name):
plist = {}
with open(path_dir,'rb') as rbf:
plist = plistlib.load(rbf)
version = plist.get('CFBundleShortVersionString','-')
bundleid = plist.get('CFBundleIdentifier','-')
name = plist.get('CFBundleName','-')
return AppInfo(name=name,version=version,bundleid=bundleid,folder=path_name)
def list_in_dir(dir,level=0):
dirs = os.listdir(dir) if os.path.isdir(dir) else []
apps = []
level -= 1
for app in dirs:
pre_path = os.path.join(dir,app)
info_plist_path = os.path.join(pre_path,'Contents/Info.plist')
if os.path.isfile(info_plist_path):
apps.append(pharse_plist(info_plist_path,app))
elif level >= 0:
apps = apps + list_in_dir(pre_path,level=level)
return apps
app_str = ''
for app in list_in_dir(app_folder,level=2):
app_str += ('<tr>' + str(app) + '</tr>\n')
table_define = """<table frame='hsides'>\n{}{}'</table>'""".format('<tr>\n<th align="left">App</th>\n<th align="left">名字</th>\n<th align="left">版本</th>\n<th align="left">BundleID</th>\n</tr>',app_str)
return table_define
- 主要是遍历了
/Applications文件夹,解析每个 App 的Info.plist文件,得到 App 列表信息,并加上了html标签进行格式化。注意/Applications里面可能包含文件夹,所以list_in_dir包含两层遍历
命令行程序备份
Mac 上的命令行工具大部分是从 homebrew 和 rubygems 两个地方安装,接下来的 Python 代码演示备份此三处的命令行信息:
def exe_command(list):
result = subprocess.run(list,stdout=subprocess.PIPE)
return result.stdout.decode("utf-8").strip('\n')
def gem_list():
return exe_command(['/Users/$(whoami)/.rvm/rubies/ruby-2.4.1/bin/gem','list']).replace("\\n",'<br>\n')
def brew_list():
return exe_command(['/usr/local/bin/brew','list']).replace("\\n",'<br>\n')
使用 subprocess.run 执行 shell 命令并得到标准输出,然后对输出做格式化处理,方便后续做阅读
发送邮件
上面得到了 App 和工具信息,现在将其发到邮箱保存。下面的代码使用了内置的邮件服务器,可能会被当做垃圾邮件或有风险的邮件而被拒收
def temp_attachment_path():
file_p = exe_command(['mktemp'])
html_ext = file_p + '.html'
os.rename(file_p,'file_p' + '.html')
# MARK: 打印临时 html 的目录,可以预览发送的格式
print(html_ext)
return html_ext
def sendEmail(html_content):
msg = MIMEText(html_content,'html','utf-8')
msg['From'] = 'APP_BACKUP@localhost.com'
# TODO: 改成自己的邮箱地址
msg['To'] = ' xxx@xxx.xxx'
msg['Subject'] = "XXXXX's MBP App 列表"
p = Popen(["/usr/sbin/sendmail", "-t","-oi"], stdin=PIPE)
p.communicate(msg.as_bytes())
if __name__ == '__main__':
app_str = application_list()
pip3_str = '<br><h2>Pip3 Apps</h2><p>%s</p>'%pip3_list()
gem_str = '<br><h2>Gem Apps</h2><p>%s</p>'%gem_list()
brew_str = '<br><h2>Homebrew Apps</h2><p>%s</p>'%brew_list()
content_str = app_str + pip3_str + gem_str + brew_str
attachment_path = temp_attachment_path()
with open(attachment_path,'w') as wf:
wf.write(content_str)
sendEmail(content_str)
上述邮件发送的内容示例:

Mac 开发工具信息的备份的更多相关文章
- Mac开发工具
便捷管理你的Mac App Homebrew:https://brew.sh/index_zh-cn 强大的文本编辑器 Sublime Text:http://www.sublimetext.com ...
- MAC 开发工具
web开发编辑器 Espresso下载地址 密码: i9hr
- Mac开发工具汇总
1: Json Parser Mac版 http://www.pc6.com/mac/180470.html
- mac 常用的开发工具
http://www.oschina.net/news/53946/mac-dev-tools 要清楚的认识到,我们寻找的不是开始按钮,而是程序入口,任何一个操作系统,用户要做的事情并不是找到开始菜单 ...
- Mac下的开发工具
1.webstrom 淘宝上2块钱就能买一个 WebStorm 是jetbrains公司旗下一款JavaScript 开发工具.被广大中国JS开发者誉为“Web前端开发神器”.“最强大的HTML5编辑 ...
- Android 常用开发工具以及Mac常用软件
Android 常用的开发工具记录.其中包括AndroidStudio(IDEA)插件.Mac 上好用的软件以及国内知名Android开发者博客等. Android Studio 插件 codota ...
- mac版微信web开发者工具(小程序开发工具)无法显示二维码 解决方案
微信小程序概念的提出,绝对可以算得上中国IT界惊天动地的一件大事,这可能意味着一场新的开发热潮即将到来, 我也怀着激动的心情准备全身心投入其中,不过截止目前,在官方网站上下载的最新版本都无法使用,打开 ...
- JetBrains IntelliJ IDEA for Mac 15.0 破解版 – Mac 上强大的 Java 集成开发工具
应网友要求更新. IntelliJ IDEA 是最强大的 Java IDE 之一,由知名的Jetbrainsg公司出品,最新版本增加了大量强大易用的特性,比如 Java 8 的Lambda 表达式调试 ...
- Mac开发必备工具(一)—— Homebrew
Homebrew 简介 macOS 缺失的软件包管理器.使用 Homebrew 安装 Apple 没有预装但 你需要的东西.官网有中文说明. 安装与配置 Homebrew 的安装非常简单,将下面这条命 ...
随机推荐
- Navicat for MySQL12破解
本文摘抄自:https://blog.csdn.net/zhangli0910/article/details/83785147,https://blog.csdn.net/mmake1994/art ...
- php Rabbitmq扩展安装坑点
pecl install amqp 出现 checking for amqp using pkg-config... configure: error: librabbitmq not found 这 ...
- Java探针技术-retransformclasses的介绍
retransformclasses void retransformclasses(class... classes) throws unmodifiableclassexception 重转换提供 ...
- 利用Python爬取OPGG上英雄联盟英雄胜率及选取率信息
一.分析网站内容 本次爬取网站为opgg,网址为:” http://www.op.gg/champion/statistics” 由网站界面可以看出,右侧有英雄的详细信息,以Garen为例,胜率为53 ...
- Vue2.0 【第二季】第1节 Vue.directive自定义指令
目录 Vue2.0 [第二季]第1节 Vue.directive自定义指令 一.什么是全局API? 二. Vue.directive自定义指令 三.自定义指令中传递的三个参数 四.自定义指令的生命周期 ...
- 在Java中使用Collections.sort 依据多个字段排序
一.如何使用Collections工具类进行排序 使用Collections工具类进行排序主要有两种方式: 1.对象实现Comparable接口,重写compareTo方法 /** * @author ...
- centos7安装部署opentsdb2.4.0
写在前面 安装HBase 在HBase中创建表结构 安装配置并启动opentsdb 写在前面 最近因为项目需要在读opentsdb的一部分源码,后面会做个小结分享出来.本人是不大喜欢写这种安装部署的文 ...
- onOK Modal.warning iview 要写一个函数 套上,不然会得不到异步调用,直接弹出的时候就执行了
export const warning = (str, callback = _ => {}, outCallback = () => {}) => { Modal.warning ...
- Windows10专业版+Microsoft office2016专业增强版免费无毒官方正版装机教程(简)
win10: 1.官网制作系统盘(具体见官网提示) 2.备份C盘 3.重启,主板调到USB优先(重启后疯狂按F12或del,具体看主板型号) 4.安装(这个看造化) 5.激活 slmgr /ipk N ...
- 第三届上海市大学生网络安全大赛 流量分析 WriteUp
题目链接: https://pan.baidu.com/s/1Utfq8W-NS4AfI0xG-HqSbA 提取码: 9wqs 解题思路: 打开流量包后,按照协议进行分类,发现了存在以下几种协议类型: ...