GengJian's Blog

一个靠写代码养家糊口的脱口秀演员

0%

打包2023年05月12日前简书博客,待调整样式及归档。

每次更换电脑的时候难免要重新装一遍常用软件和开发环境,这里记录一下必备命令行工具的安装列表及成功截图(在有梯子的情况下,不讨论网络卡顿的情况)。

#1. 安装HomeBrew[https://brew.sh/]

通过Curl 安装homebrew

1
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

刷新环境变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> /Users/gengjian/.zprofile
eval "$(/opt/homebrew/bin/brew shellenv)"
```bash
验证安装完成
```bash
brew help
```bash
![Homebrew安装完成记得刷新环境变量.png](https://upload-images.jianshu.io/upload_images/708960-56d9b9f1f1d8f7d2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

# 2. 美化终端命令行工具iTerm2 + OmMyZsh[https://ohmyz.sh/]

通过crul安装zsh主题,毕竟mac默认用zshell替代bashshell了
```curl
sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
```curl
![安装ohmyzsh完成.png](https://upload-images.jianshu.io/upload_images/708960-f867c93bbd64e2ee.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)


# 3. 安装Rvm区分ruby镜像[http://rvm.io/]
安装gpg用于rvm校验安装包
```zsh
brew install gpg
```zsh

Install GPG keys
```zsh
gpg --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
```zsh

通过curl安装rvm
```zsh
\curl -sSL https://get.rvm.io | bash -s stable

安装RVM成功.png

获取最新的ruby版本并切换镜像
–default指的是每次打开命令行工具默认使用此版本的gem

1
2
3
4
rvm list known
rvm install 2.7.2
rvm use 2.7.2 --default
rvm list

安装区分于系统的独立Ruby环境完成.png

4. 安装iOS包管理工具 Cocoapods [https://cocoapods.org/]

注:gem是rubygems管理工具,–verbose是打印详细日志
通过rubgem安装cocoapods

1
gem install cocoapods --verbose

查询cocoapods安装结果

1
pod --version

cocoapods安装完成.png

应用场景

读写repo时一般有两种办法:通过Https时依赖账号和密码(个人令牌),或者通过SSH证书获取访问权限,此时需要的是在个人账户下统一配置公钥即可。

因为私钥留存在本地~/.ssh目录中,git-CLI用私钥访问远端仓库时,GitHub将通过公钥验证此访问时的私钥是否合法。

通过GithubAction等CI-CD操作时:因为repoA要读写repoB的内容,那么repo A就要配置私钥,repo B要配置公钥。

repo A 应在 Repository secret下填写私钥,
repo A.png

repo B 应在 Deploy keys下填写公钥,
repo B.png

以此实现repo A访问repo B的权限。
A Action CI.png
B Action CD.png

生成命令

github介绍文档
https://docs.github.com/en/github/authenticating-to-github/connecting-to-github-with-ssh/about-ssh

gitee介绍文档
https://gitee.com/help/categories/38

本地已ssh公钥查询

1
ls -al ~/.ssh

本地ssh域名配置查询

1
cat ~/.ssh/config

访问权限查询

1
2
ssh -T git@gitee.com
ssh -T git@github.com

版本汇总

Android OS用户分布 2021-09-01.png

创建工程

通过模版创建
EmptyActivity模版.png
Name:项目名称;项目目录文件夹的名称,会默认展示在启动页,一般要求开头大写。
Package name:唯一包名;在应用市场区分身份标识,用于更新覆盖等。
Mininum SDK: 支持的最低Android OS版本;应用市场可通过此版本检查用户手机是否可以安装;但如果低于最低版本的用户通过直接安装apk或者aab文件的话,可能出现可以安装但无法打开的情况。
Use legacy android.support libraries:如果您的应用需要旧版库支持,请选中复选框。

同步Gradle

Gradle 是一个开源构建自动化工具,专注于灵活性和性能。可以说是接管了Android中的包管理工具及编译打包等流程。

当我们启动项目时,AndroidStudio会自动执行一次同步。

分析文件目录Directory

MainActivity 是应用的主入口;相当于iOS创建项目时自带的ViewController;
activity_main位于res/layout目录中,是MainActivity的UI布局文件;相当于iOS中的xib文件,通过预览的方式实现所见即所得;
AndroidManifest.xml是应用的清单文件,描述了应用的基本特性并定义了每个应用组件;相当于iOS中的Build Phase配置;

分析脚本目录Script

有两个使用此名称的文件:一个针对项目“Project: My First App”,相当于iOS中的Project Setting,另一个针对应用模块“Module: My_First_App.app”,相当于iOS中的 Target Setting。每个模块均有自己的 build.gradle 文件。

运行调试

  1. 可采用真机调试,需要安装对应的驱动,并打开设备的开发者模式;
  2. 可采用模拟器(AVD Manager);

通过点击IDE的▶️按钮开始运行即可。

IDE

  • 官方的:IDEL+Python Luncher
  • 好用的:PyCharm
  • 命令行的
1
2
3
sudo pip install --upgrade pip
sudo pip install ipython
➜ ~ python -m IPython

惯例吹水

众所周知CocoaPods,已经成为iOS/Mac OS程序员离不开的三方库管理工具。

除了我们引用一些知名的大佬框架以外,有时候我们也想分享一下自己的小轮子,或者托管自己的私有框架,尤其是组件化需要,想要上传属于自己的CocoaPods怎么办呢?

查阅了官方文档和一些前辈们的blog,感觉并不难,为了便于理解每一步命令的作用,决定还是需要自己手撸一遍。

什么是CocoaPods

Define once, update easily。看到宣传标语就感觉很easy。CocoaPods是OS X和iOS下的一个第三类库管理工具,通过PodFile文件我们可以为项目添加被称为“Pods”的依赖库(这些类库必须是CocoaPods本身所支持的),并且可以轻松管理其版本。

怎么安装CocoaPods

官方app下载地址

https://CocoaPods.org/app

民间小白鼠🐁教程

https://www.jianshu.com/p/e85e71ed64e6

涉及到的一些概念

Podfile: 该文件为配置引用三方库文件,指定引用的库以及版本。

Podfile.lock: cocoapods根据本地podfile和远端仓库生成版本管理文件,便于用户协作。

.xcodeproj: iOS项目工程目录,本质是个文件夹,可用Xcode打开。

.xcworkspace:工作空间,联合多个项目工程,pod install后自动生成。

.podspec : 该文件为你的代码仓库索引描述文件,CocoaPods通过该文件对你真正存储代码工程的 Git 仓库进行索引与下载

本博客演示所用文件

SoulToolsLibrary: 托管我们的实现代码(根据公有私有选择是否公开),需要remote对应远程Git仓库

SoulPrivatePodspec: 托管我们生成的Podspec文件(私有Pod才用),私有库隐藏了源码则需要公开本仓库

SoulTestDemo: 模拟三方用户新建工程测试我们的Pod,不需要远程仓库,如果你非要建,就当我没说

以上文件目录,均放在**~/MyPodLibrary**目录里了,方便演示

image-20180920110426392.png

上传一个公有Pod


官方文档如下

https://guides.CocoaPods.org/making/index.html

  1. 搜索有没有同名库

    (因为最后一步CocoaPods会校验同名的库只有原作者才能上传)

    image-20180919205834417.png

  2. 创建远程仓库

我这里采用的gitee.com。其实和github.com是一样的,不过github只能建一个私有仓库不够用,所以就用码云了。

a.首先必须创建SoulToolsLibrary,这个仓库用来保存我们的轮子源码。
开源的话记得选开源许可证,我就直接MIT了;不开源的话,需要创建SoulPrivatePodspec仓库。这里不需要添加**.Readme**初始化,因为后边pods会自动帮我们添加Readme模板。

Gitee

创建完成后无需Clone到本地目录,等下把CocoaPods自动生成的同名目录Remote过来就好了。后面我直接用SourceTree了,方便演示,当然也可以用命令行。
(本模块演示公有Pod,可以直接跳转到步骤c,私有的需要b的,下个模块单独解释。)

b.其次私有库的话需要创建SoulPrivatePodspec,这个仓库用来储存各个版本的**.podspec索引文件**。
直接开源就好,不然别人pod install的时候,还要获取你这个git权限。
创建完成后Clone到本地目录,我这里直接用SourceTree了,方便演示,当然也可以用命令行。

c.最后我们本地再建一个目录SoulTestDemo,用来模拟第三方用户工程测试我们pod能不能用,这个就留在本地就好了,不用同步到远端了。

最后目录如下图
演示文件目录.png

  1. 本地新建工程
    本地新建测试工程.png

我们现在需要通过github的模板生成自己的Pod库开发环境

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/*进入本地目录*/
cd ~/Users/mac/MyPodLibrary/SoulToolsLibrary

/*创建我们的pod库开发环境*/
pod lib create SoulToolsLibrary

/*配置开发环境*/
直接回车就是带下划线的默认值,具体配置如下附图

/*说明*/
配置完成后 会自动创建并打开Workspace

```

附图:![image-20180920115446795.png](https://upload-images.jianshu.io/upload_images/708960-e71248424c34d839.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

//platform 发布平台
iOS
//language 开发使用的语言
ObjC
//demo 是否包含演示程序;有两个用途:1.编写框架的时候可以用来测试,2.支持pod try MyLib(SoulToolsLibrary)
Yes
//testing frameworks 使用什么测试框架;
None
//view base testing 是否使用基于视图的测试;亲测选择yes的话,将自动导入FBSnapShotTestCase,这个框架只支持swift3.0,要求Xcode8一下…
NO
//class prefix 类名前缀;建议两位大写英文字母
ST

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

4. 编写Library以及Demo

![编写Library以及Demo.png](https://upload-images.jianshu.io/upload_images/708960-4a992a7ae22eb609.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

a.在上述自动打开的workspace,我们可以看到就说熟悉的pod install之后生成xworkspace是一样的,唯一不同的就是Pod引用我们自己的库的路径是本地相对路径。红框内的内容及Podspec的描述,两个红框指向的是同一文件;LICENSE即开源许可,一般不用管;README也是Cocoapods自动生成的描述,按照原有格式修改即可。

b.在上图中ReplaceMe.m文件处右键,Show in Finder。我们会发现两个平级目录,一个Classes保存我们类,还有一个Assets保存的是资源文件,例如图片等。这个示例文件ReplaceMe.m可以删除。
![i自动生成的文件目录.png](https://upload-images.jianshu.io/upload_images/708960-eae9faf7a7a9b99b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

c.我们添加一个自定义类和方法,实现我们的库。
![随手写个类方法.png](https://upload-images.jianshu.io/upload_images/708960-360c8003f2a6b0b4.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

d.在Demo实现调用,我们打印一下。尖括号引用,完美运行~
![image-20180920171039773.png](https://upload-images.jianshu.io/upload_images/708960-a0c821e46e5c148a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

5. 配置xxx.podspec文件

```text
s.name : 项目名

s.version : 版本号(需跟后面打 Tag 的值相等)

s.homepage : 项目主页(请注意,这里的地址跟git仓库地址有一定差别,请同学们看清截图示例并区分)

s.license : 开源协议(这里我们选择 MIT )

s.source : Git 仓库地址(第二步所复制的仓库地址)

s.ios.deployment_target : 项目最低支持版本

s.source_files : 具体去那个目录下下载特定共享代码(注意:这里的地址与 .podspec 文件同级目录开始,,示例:PrivateLib/Classes/** /*表示如下目录下的所有文件

image-20180920172749679.png
image-20180920172815009.png

  1. 验证.podspec 文件的格式正确性
1
pod lib lint --verbose

出现下图,即代表成功;
这里有个小技巧,就是lint前可以先回到xcodeproj目录pod install一下,自己排查有没有编译问题;
如果还有其他报错例如描述不合法等情况,修改后重新lint即可。

image-20180920175435541.png

  1. 上传到Git,并标记Tag
    image-20180920184108974.png

  2. 注册CocoaPods作者信息
    a.现在你已经拥有一个成功的SoulToolsLibrary了,现在想要share到平台上,那么是不是需要注册一个账号呢?ok通过以下命令,将会给你的邮箱发送一封邮件,点击链接即可注册成功。

1
pod trunk register yourEmail@gmail.com 'yourName' --description='Soul Personal Laptop' --verbose

i申请账号.png

去邮箱查询邮件.png

点击激活链接之后.png

搞定.png

账号创建完毕!~~

  1. 使用trunk上传pod
1
pod trunk push SoulToolsLibrary.podspec --verbose

image-20180920190141130.png

感觉ok了,可以访问看一下这个json,一目了然就不分析了。
https://raw.githubusercontent.com/CocoaPods/Specs/b2c3735a9046e5373956b35a510414a93b0af5ff/Specs/4/b/a/SoulToolsLibrary/0.1.0/SoulToolsLibrary.podspec.json

  1. 搜索验证并使用
    a.新建一个项目,并初始化Pod
    image-20180920193107194.png

b.编辑Podfile并install
image-20180920193647745.png

c.Test调用打印
image.png

d.pod Search 一下 or pod try 一下;记得先pod setup更新一下本地库
image-20180920191220476.png

上传一个私有Pod(对比公有)


1.托管代码的SoulToolsLibrary需要关闭开源。
2.将生成的podspec文件托管到SoulPrivatePodspec中,SoulPrivatePodspec仓库可以开源。
3.pod install的时候需要验证Git权限,即登录账号密码。

Cocoapods进阶


1.libwebp库Pod失败
业务场景:使用SDWebImage时需要支持webp,引入库SDWebImage/WebP后Pod install时执行失败。
解决思路:pod的原理就是从.podspec中获取配置,一般从github中同步代码;所以我们看一下托管的仓库地址,发现是google家的,一想那就是因为天朝的墙了
解决办法:

1
2
3
1、先通过 find ~/.cocoapods/repos/master -iname libwebp 直接就可以找到libwebp的地址
2、在Finder中找到对应版本的文件夹,找到libwebp.podspec.json文件
3、修改https://chromium.googlesource.com/webm/libwebp,替换为https://github.com/webmproject/libwebp.git

问题

无论是我们的开发机器,还是打包机MacMini,经常因为缓存文件或打包文件过多导致硬盘不足。

所以我们需要定期清理垃圾文件。

解决方案

需要删除Xcode编译器产生的索引文件及中间产物目录DriverData。
需要删除Xcode打包完成的Archive文件目录。
需要删除每次连接真机后自动下载的调试包(类似Android的adb文件)DeviceSupport。
需要删除不必要的模拟器(每次增量升级xcode,原有的模拟器数据会保留,持久占用硬盘)。


常用来查询硬盘大小及使用率的Linux命令。
一般直接用 df
df

df命令可以获取硬盘被占用了多少空间,目前还剩下多少空间等信息,它也可以显示所有文件系统对i节点和磁盘块的使用情况。

df命令各个选项的含义如下:

-a:显示所有文件系统的磁盘使用情况,包括0块(block)的文件系统,如/proc文件系统。
-k:以k字节为单位显示。
-i:显示i节点信息,而不是磁盘块。
-t:显示各指定类型的文件系统的磁盘空间使用情况。
-x:列出不是某一指定类型文件系统的磁盘空间使用情况(与t选项相反)。
-T:显示文件系统类型。

du
du的英文原义为“disk usage”,含义为显示磁盘空间的使用情况,统计目录(或文件)所占磁盘空间的大小。该命令的功能是逐级进入指定目录的每一个子目录并显示该目录占用文件系统数据块(1024字节)的情况。若没有给出指定目录,则对当前目录进行统计。

df命令的各个选项含义如下:

-s:对每个Names参数只给出占用的数据块总数。
-a:递归地显示指定目录中各文件及子目录中各文件占用的数据块数。若既不指定-s,也不指定-a,则只显示Names中的每一个目录及其中的各子目录所占的磁盘块数。
-b:以字节为单位列出磁盘空间使用情况(系统默认以k字节为单位)。
-k:以1024字节为单位列出磁盘空间使用情况。
-c:最后再加上一个总计(系统默认设置)。
-l:计算所有的文件大小,对硬链接文件,则计算多次。
-x:跳过在不同文件系统上的目录不予统计。
fdisk

fdisk可以划分磁盘分区。下面给出使用Fdisk命令进行磁盘分区的操作步骤:
#fdisk /dev/had //使用/dev/had作为默认的分区设备
Command (m for help): m //选择命令选项
Command action
a toggle a bootable flag
b edit bsd disklabel
c toggle the dos compatibility flag
d delete a partition
l list known partition types
m print this menu
n add a new partition
o create a new empty DOS partition table
p print the partition table
q quit without saving changes
s create a new empty Sun disklabel
t change a partition’s system id
u change display/entry units
v verify the partition table
w write table to disk and exit
x extra functionality (experts only)
用户通过提示键入“m”,可以显示Fdisk命令各个参数的说明。

相关的文章
Jenkins上使用的脚本备份

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#!/bin/sh

# 先查询一下当前硬盘空间
echo "🌞 0、开始清理前硬盘空间"
df -lh

echo "------------1、准备删除 ~/Library/Developer/Xcode/DerivedData"
for file in ~/Library/Developer/Xcode/DerivedData/*;do
# 确定是目录
if test -d $file;then
echo "删除--->"$file
rm -rf $file
fi
done

echo "------------2、准备删除 /Users/lebbay/DerivedData"
for file in /Users/lebbay/DerivedData/*;do
# 确定是目录
if test -d $file;then
echo "删除--->"$file
rm -rf $file
fi
done

echo "------------3、准备删除 ~/Library/Developer/Xcode/Archives"
for file in ~/Library/Developer/Xcode/Archives/*;do
# 确定是目录
if test -d $file;then
# 不是今天的都删掉
today=$(date "+%Y-%m-%d")
if [[ ! $file =~ $today ]];then
echo "删除--->"$file
rm -rf $file
fi
fi
done


echo "------------4、准备删除 /Users/lebbay/Archives"
for file in /Users/lebbay/Archives/*;do
# 确定是目录
if test -d $file;then
# 不是今天的都删掉
today=$(date "+%Y-%m-%d")
if [[ ! $file =~ $today ]];then
echo "删除--->"$file
rm -rf $file
fi
fi
done


echo "------------5、准备删除 ~/Library/Developer/CoreSimulator/Devices,仅保留 SE 机型"

for file in ~/Library/Developer/CoreSimulator/Devices/*;do
# 确定是目录
if test -d $file;then
device_plist="${file}/device.plist"
device_plist_text=`cat $device_plist`
se_line="<string>com.apple.CoreSimulator.SimDeviceType.iPhone-SE"
if [[ ! $device_plist_text =~ $se_line ]]; then
echo "删除--->"$file
rm -rf $file
else
echo "保留--->"$file
fi
fi
done


echo "------------6、准备删除 ~/Library/Developer/Xcode/iOS\ DeviceSupport,保留自动化测试常用系统"
for file in ~/Library/Developer/Xcode/iOS\ DeviceSupport/*;do

# 手机系统升级之后就不好使喽。。。

# iPhone 8 序列号:F4GX3EK1JC6F
iphone_13_3_1="/13.3.1"
# iPhone X 序列号:G0NVPS22JCLF
iphone_14_0_1="/14.0.1"
if [[ $file =~ $iphone_13_3_1 ]]; then
echo "保留--->"$file
elif [[ $file =~ $iphone_14_0_1 ]]; then
echo "保留--->"$file
else
echo "删除--->"$file
rm -rf $file
fi
done


# 最后查询一下当前硬盘空间
echo "🌛 0、开始清理前硬盘空间"
df -lh

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

1
hexo new "My New Post"

More info: Writing

Run server

1
hexo server

More info: Server

Generate static files

1
hexo generate

More info: Generating

Deploy to remote sites

1
hexo deploy

More info: Deployment