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进行编译才可以执行最新的代码

swift 开发命令行工具_第1张图片
运行可执行文件

swift 开发命令行工具_第2张图片
目录结构

三. 生成xcodeproj

我们可以使用swift package --help来查看一些命令, 通过查看, 我们可以看到 swift package manager 给我们提供了一个命令: swift package generate-xcodeproj 用来在当前目录创建一个`xcodeproj

swift 开发命令行工具_第3张图片
帮助命令

四. 确定输入的参数设置

搜索不用的图片的资源我们想要的参数:
--project 确定在哪个文件夹下进行搜索 路径
--resource-extensions 想要搜索什么样的文件 后缀名 png jpg imageset gif jpeg
--file-extensions 我们在什么样的文件里去搜索 例如 .m .mm .swift 文件

a. xib, storyboard中所使用的图片都是以XML文本的形式存在
所有只要查找 image name="" 的形式找出图片, 如下图格式

swift 开发命令行工具_第4张图片
xib, storyboard中的图片

b. 在代码中我们一般使用 UIImage(named: ""), 只需要在.m或.mm中查找即可

五. 如何找到我们输入的参数:

我们输入的参数都在CommandLine.arguments中, 例如在main.swift中print(CommandLine.arguments)
执行swift build进行编译, 然后执行编译后的文件, 获取参数

swift 开发命令行工具_第5张图片
获取参数

可以看到上图中的 两个参数 gao yu就打印出来了
我们在代码中可以通过循环遍历出参数, 但是很麻烦, 这种事情应该用一个轮子来做: 这时候我们应该引入第三方库

for argu in CommandLine.arguments {
    
}

六: 如何在在package中引入第三方库

swift 开发命令行工具_第6张图片
引入第三方库

引入后执行swift build编译一下, 而且swift package generate-xcodeproj只生效一次, 如果改动了xcode的设置或者一些依赖什么的, 也需要执行以下swift package generate-xcodeproj这个命令

swift 开发命令行工具_第7张图片
示例1

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

swift 开发命令行工具_第8张图片
示例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 开发命令行工具_第9张图片
执行

在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 开发命令行工具_第10张图片
Sources目录

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

swift 开发命令行工具_第11张图片
build效果

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

swift 开发命令行工具_第12张图片
Package.swift

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

swift 开发命令行工具_第13张图片
依赖 GYReduceKit

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

关于测试:

swift 开发命令行工具_第14张图片
测试示例

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

你可能感兴趣的:(swift 开发命令行工具)