swift 开发命令行工具

仿照喵神写的的清理未使用图片的工具, 里面有很详细的注释介绍
自己写的命令行打包工具 欢迎star

本文通过对学习喵神写蜂鸟项目所做的记录
任务: 清除xcode中未使用的图片
步骤:

  1. 在所有搜索文件(swift, m, mm, xib, storyboard, etc)中寻找字符串 (并去除图片后缀和扩展名)
  2. 在文件夹中寻找所有图片资源(png, jpg, imageset, etc), 获取文件名和对应路径
  3. 从所有图片资源(2)中将所用到的资源字符串(1)过滤掉, 剩下的就是没有使用的图片
  4. 删除(3)中剩下的图片

首先创建一个项目的空的文件夹
xcode 8以上自带package manager, 我们可以用项目的空目录下使用命令swift package init创建, 我们可以给这个工程加一个type, 默认的typeLibrary, 就是别人可以使用的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="" 的形式找出图片, 如下图格式

xib, storyboard中的图片

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这个命令

示例1

然后我们会发现项目中多了一个第三方的target

示例2

如果遇到一些第三方框架有些报错或问题, 可以使用下面的方法:
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指定出来

例如下图:

Sources目录

然后我们在项目目录下执行swift build

build效果

然后我们在Package.swift中指定targets设置依赖关系

Package.swift

设置完依赖关系后执行swift package generate-xcodeproj, 我们会发现主程序依赖了GYReduceKit这个framework

依赖 GYReduceKit

这时候在GYReduceTool这个主程序的文件夹下的所有文件都可以import GYReduceKit, 并使用这个库的方法

关于测试:

测试示例

写好了测试的代码, 可以点击左边的按钮进行测试, 也可以在项目目录下输入命令行命令: swift test

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,723评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,080评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,604评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,440评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,431评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,499评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,893评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,541评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,751评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,547评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,619评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,320评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,890评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,896评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,137评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,796评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,335评论 2 342

推荐阅读更多精彩内容