相信大部分程序员都对开发环境的工具都有一些特殊的执念(???),如果在自己不习惯的环境中工作完全无法开展,怎么这个工具没有那个字体难受,我本人就是,换了新的 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 实现
  1. class AppInfo():
  2. def __init__(self,name,version,bundleid,folder):
  3. self.name = name
  4. self.version = version
  5. self.bundleid = bundleid
  6. self.folder = folder
  7. def __str__(self):
  8. 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)
  9. def application_list():
  10. app_folder = "/Applications"
  11. def pharse_plist(path_dir,path_name):
  12. plist = {}
  13. with open(path_dir,'rb') as rbf:
  14. plist = plistlib.load(rbf)
  15. version = plist.get('CFBundleShortVersionString','-')
  16. bundleid = plist.get('CFBundleIdentifier','-')
  17. name = plist.get('CFBundleName','-')
  18. return AppInfo(name=name,version=version,bundleid=bundleid,folder=path_name)
  19. def list_in_dir(dir,level=0):
  20. dirs = os.listdir(dir) if os.path.isdir(dir) else []
  21. apps = []
  22. level -= 1
  23. for app in dirs:
  24. pre_path = os.path.join(dir,app)
  25. info_plist_path = os.path.join(pre_path,'Contents/Info.plist')
  26. if os.path.isfile(info_plist_path):
  27. apps.append(pharse_plist(info_plist_path,app))
  28. elif level >= 0:
  29. apps = apps + list_in_dir(pre_path,level=level)
  30. return apps
  31. app_str = ''
  32. for app in list_in_dir(app_folder,level=2):
  33. app_str += ('<tr>' + str(app) + '</tr>\n')
  34. 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)
  35. return table_define
  • 主要是遍历了 /Applications 文件夹,解析每个 App 的 Info.plist 文件,得到 App 列表信息,并加上了 html 标签进行格式化。注意 /Applications 里面可能包含文件夹,所以 list_in_dir 包含两层遍历

命令行程序备份

Mac 上的命令行工具大部分是从 homebrewrubygems 两个地方安装,接下来的 Python 代码演示备份此三处的命令行信息:

  1. def exe_command(list):
  2. result = subprocess.run(list,stdout=subprocess.PIPE)
  3. return result.stdout.decode("utf-8").strip('\n')
  4. def gem_list():
  5. return exe_command(['/Users/$(whoami)/.rvm/rubies/ruby-2.4.1/bin/gem','list']).replace("\\n",'<br>\n')
  6. def brew_list():
  7. return exe_command(['/usr/local/bin/brew','list']).replace("\\n",'<br>\n')

使用 subprocess.run 执行 shell 命令并得到标准输出,然后对输出做格式化处理,方便后续做阅读

发送邮件

上面得到了 App 和工具信息,现在将其发到邮箱保存。下面的代码使用了内置的邮件服务器,可能会被当做垃圾邮件或有风险的邮件而被拒收

  1. def temp_attachment_path():
  2. file_p = exe_command(['mktemp'])
  3. html_ext = file_p + '.html'
  4. os.rename(file_p,'file_p' + '.html')
  5. # MARK: 打印临时 html 的目录,可以预览发送的格式
  6. print(html_ext)
  7. return html_ext
  8. def sendEmail(html_content):
  9. msg = MIMEText(html_content,'html','utf-8')
  10. msg['From'] = 'APP_BACKUP@localhost.com'
  11. # TODO: 改成自己的邮箱地址
  12. msg['To'] = ' xxx@xxx.xxx'
  13. msg['Subject'] = "XXXXX's MBP App 列表"
  14. p = Popen(["/usr/sbin/sendmail", "-t","-oi"], stdin=PIPE)
  15. p.communicate(msg.as_bytes())
  16. if __name__ == '__main__':
  17. app_str = application_list()
  18. pip3_str = '<br><h2>Pip3 Apps</h2><p>%s</p>'%pip3_list()
  19. gem_str = '<br><h2>Gem Apps</h2><p>%s</p>'%gem_list()
  20. brew_str = '<br><h2>Homebrew Apps</h2><p>%s</p>'%brew_list()
  21. content_str = app_str + pip3_str + gem_str + brew_str
  22. attachment_path = temp_attachment_path()
  23. with open(attachment_path,'w') as wf:
  24. wf.write(content_str)
  25. sendEmail(content_str)

上述邮件发送的内容示例:

Mac 开发工具信息的备份的更多相关文章

  1. Mac开发工具

    便捷管理你的Mac App Homebrew:https://brew.sh/index_zh-cn 强大的文本编辑器 Sublime Text:http://www.sublimetext.com ...

  2. MAC 开发工具

    web开发编辑器 Espresso下载地址   密码: i9hr

  3. Mac开发工具汇总

    1: Json Parser Mac版 http://www.pc6.com/mac/180470.html

  4. mac 常用的开发工具

    http://www.oschina.net/news/53946/mac-dev-tools 要清楚的认识到,我们寻找的不是开始按钮,而是程序入口,任何一个操作系统,用户要做的事情并不是找到开始菜单 ...

  5. Mac下的开发工具

    1.webstrom 淘宝上2块钱就能买一个 WebStorm 是jetbrains公司旗下一款JavaScript 开发工具.被广大中国JS开发者誉为“Web前端开发神器”.“最强大的HTML5编辑 ...

  6. Android 常用开发工具以及Mac常用软件

    Android 常用的开发工具记录.其中包括AndroidStudio(IDEA)插件.Mac 上好用的软件以及国内知名Android开发者博客等. Android Studio 插件 codota ...

  7. mac版微信web开发者工具(小程序开发工具)无法显示二维码 解决方案

    微信小程序概念的提出,绝对可以算得上中国IT界惊天动地的一件大事,这可能意味着一场新的开发热潮即将到来, 我也怀着激动的心情准备全身心投入其中,不过截止目前,在官方网站上下载的最新版本都无法使用,打开 ...

  8. JetBrains IntelliJ IDEA for Mac 15.0 破解版 – Mac 上强大的 Java 集成开发工具

    应网友要求更新. IntelliJ IDEA 是最强大的 Java IDE 之一,由知名的Jetbrainsg公司出品,最新版本增加了大量强大易用的特性,比如 Java 8 的Lambda 表达式调试 ...

  9. Mac开发必备工具(一)—— Homebrew

    Homebrew 简介 macOS 缺失的软件包管理器.使用 Homebrew 安装 Apple 没有预装但 你需要的东西.官网有中文说明. 安装与配置 Homebrew 的安装非常简单,将下面这条命 ...

随机推荐

  1. 第四章、深入理解vue组件

    4-1.使用组件的细节 a.使用is解决html出现bug 如下 table下面应该为tr,所以页面渲染的时候没有找到tr是有问题的,所以是有小bug,所以table中必须是tr b.改上面bug,t ...

  2. form表单提交没有跨域问题,但ajax提交存在跨域问题

    浏览器的策略本质是:一个域名下面的JS,没有经过允许是不能读取另外一个域名的内容,但是浏览器不阻止你向另外一个域名发送请求. 所以form表单提交没有跨域问题,提交form表单到另外一个域名,原来页面 ...

  3. 基于springcloud搭建项目-Feign篇(四)

    上一篇已经写过ribbon客户端负载均衡的用法了,这篇主要是介绍feign的用法,首先我们必须了解feign是什么?能干嘛?怎么用? 这里简单介绍一下,然后进行代码测试 1.概述 Feign是一个声明 ...

  4. springmvc与swagger2

    首先呢我们导入相关的jar包文件 为了方便copy我copy一份 <!-- 导入java ee jar 包 -->        <dependency>           ...

  5. JVM05——JVM类加载机制知多少

    我们已经讲过 JVM 相关的很多常见知识点,感兴趣的朋友可以在我的往期文章中查看.接下来将继续为各位带来 JVM 类加载机制.关注我的公众号「Java面典」了解更多 Java 相关知识点. 类生命周期 ...

  6. php实现下载功能

    <?php header("Content-type:text/html;charset=utf-8"); $file_name="1.text"; // ...

  7. Python——项目-小游戏

    开始我们的项目 飞机大战 1 项目的初体验 以及前期准备 游戏初体验画面 验证一下本地第三方包有没有导入 python3 -m pygame.examples.aliens 如果没有出现游戏画面请先安 ...

  8. asp:textbox 的 TextMode:password

    1.  用于输入或显示密码的文本框,设置属性TextMode为Password <asp:TextBox ID="txt_Password" runat="serv ...

  9. CSS每日学习笔记(1)

    7.30.2019 1.CSS 文本属性 属性 描述 color 设置文本颜色 direction 设置文本方向. line-height 设置行高. letter-spacing 设置字符间距. t ...

  10. 软件工程作业0——The Road Not Taken

    目录 第一部分:结缘计算机 缘起 四顾 思考 第二部分:在计算机系里学习 挑战 落差 第三部分:未来规划 向前 未来四个月的软工课 项目 内容 这个作业属于 2020春季计算机学院软件工程(罗杰 任健 ...