仿照喵神写的的清理未使用图片的工具, 里面有很详细的注释介绍
自己写的命令行打包工具 欢迎star
本文通过对学习喵神写蜂鸟项目所做的记录
任务: 清除xcode中未使用的图片
步骤:
- 在所有搜索文件(swift, m, mm, xib, storyboard, etc)中寻找字符串 (并去除图片后缀和扩展名)
- 在文件夹中寻找所有图片资源(png, jpg, imageset, etc), 获取文件名和对应路径
- 从所有图片资源(2)中将所用到的资源字符串(1)过滤掉, 剩下的就是没有使用的图片
- 删除(3)中剩下的图片
首先创建一个项目的空的文件夹
xcode 8以上自带package manager
, 我们可以用项目的空目录下使用命令swift package init
创建, 我们可以给这个工程加一个type
, 默认的type
是Library
, 就是别人可以使用的framework. 这里我们创建的是一个可执行文件
, 使用命令swift package init --type executable
执行结果:
gaoyu@localhost ~/Desktop/repo/GYReduceTool swift package init --type executable
Creating executable package: GYReduceTool
Creating Package.swift
Creating Sources/
Creating Sources/main.swift
Creating Tests/
Package.swift 文件: 负责解析这个项目的一些依赖和项目名字
Sources/ : 我们的代码一般在该文件夹下
一. 先来看 Package.swift 中的代码:
import PackageDescription
let package = Package(
name: "GYReduceTool"
)
Package
这个struct是在 PackageDescription
中来的, 这个文件是用来让package manager知道你的package是什么, 安装或寻找其他的package的时候, package manager会在项目的仓库里寻找Package.swift
文件, 并且执行这个文件, 提取出以package
为名字的变量,然后进行安装
二. main.swift
这个文件是可执行文件的入口, 如果我们想要编译这个文件, 我们需要在命令行中执行swift build
, 则编译以后的文件在当前文件夹下的./.build/debug/GYReduceTool
中, 想要运行这个编译后的文件我们只需要执行命令: 就会执行里面的代码输出hello world!
以后每次写完一段代码想要执行, 都要重新执行swift build
进行编译才可以执行最新的代码
三. 生成xcodeproj
我们可以使用swift package --help
来查看一些命令, 通过查看, 我们可以看到 swift package manager 给我们提供了一个命令: swift package generate-xcodeproj
用来在当前目录创建一个`xcodeproj
四. 确定输入的参数设置
搜索不用的图片的资源我们想要的参数:
--project 确定在哪个文件夹下进行搜索 路径
--resource-extensions 想要搜索什么样的文件 后缀名 png jpg imageset gif jpeg
--file-extensions 我们在什么样的文件里去搜索 例如 .m .mm .swift 文件
a. xib, storyboard中所使用的图片都是以XML文本的形式存在
所有只要查找 image name="" 的形式找出图片, 如下图格式
b. 在代码中我们一般使用 UIImage(named: ""), 只需要在.m或.mm中查找即可
五. 如何找到我们输入的参数:
我们输入的参数都在CommandLine.arguments
中, 例如在main.swift中print(CommandLine.arguments)
执行swift build
进行编译, 然后执行编译后的文件, 获取参数
可以看到上图中的 两个参数 gao
yu
就打印出来了
我们在代码中可以通过循环遍历出参数, 但是很麻烦, 这种事情应该用一个轮子来做: 这时候我们应该引入第三方库
for argu in CommandLine.arguments {
}
六: 如何在在package中引入第三方库
引入后执行swift build
编译一下, 而且swift package generate-xcodeproj
只生效一次, 如果改动了xcode的设置或者一些依赖什么的, 也需要执行以下swift package generate-xcodeproj
这个命令
然后我们会发现项目中多了一个第三方的target
如果遇到一些第三方框架有些报错或问题, 可以使用下面的方法:
swift build --clean
相当于xcode的清理, 然后在执行swift bulid
七: 写代码, 获取用户输入的参数
import Foundation
import CommandLineKit
let cli = CommandLineKit.CommandLine()
/// shortFlag: "p": 表示 -p longFlag: "project": 表示 --project required: false 是否为必须的参数
let projectOption = StringOption(shortFlag: "p",
longFlag: "project",
helpMessage: "Path to the project.")
// MultiStringOption 字符串数组
let resourceExtensionsOption = MultiStringOption(shortFlag: "r",
longFlag: "resource-extensions",
helpMessage: "Extensions to search.")
let fileExtensionsOption = MultiStringOption(shortFlag: "f",
longFlag: "file-extensions",
helpMessage: "File Extensions to search.")
let help = BoolOption(shortFlag: "h", longFlag: "help",
helpMessage: "Prints a help message.")
cli.addOptions(projectOption, resourceExtensionsOption, fileExtensionsOption, help)
do {
try cli.parse()
} catch {
cli.printUsage(error)
exit(EX_USAGE)
}
print(projectOption.value)
执行:
在swift package manager中会在Sources
文件夹下寻找, 如有有文件main
, 他就会认为这个文件是一个可执行文件, 把它打成一个可执行文件,
package manager在组织编译项目的时候使用各个文件夹来区分各个target
的
比如我在 Sources
文件夹下, 创建一个文件夹aaa
, aaa
文件夹下有main.swift
, 则aaa
就会被编译成一个可执行文件, 项目中只有一个main
如果我在Sources
文件夹下, 创建一个文件夹bbb
, 项目b中就不可以再有main
了, 但是这个文件夹会被当成Library(库)
来处理, 就会编译成framework
, 这时候, 我们只要在项目中链接这个framework
, 就可以使用了, 但是我们链接以后, 再执行swift package generate-xcodeproj
, 这个链接就会坏掉, 这个命令是单向的 , 所以最好再Package.swift
中把这个framework
指定出来
例如下图:
然后我们在项目目录下执行swift build
然后我们在Package.swift
中指定targets
设置依赖关系
设置完依赖关系后执行swift package generate-xcodeproj
, 我们会发现主程序依赖了GYReduceKit
这个framework
这时候在GYReduceTool
这个主程序的文件夹下的所有文件都可以import GYReduceKit
, 并使用这个库的方法
关于测试:
写好了测试的代码, 可以点击左边的按钮进行测试, 也可以在项目目录下输入命令行命令: swift test