swift 开发命令行工具

作者: 东方_未明 | 来源:发表于2017-05-25 13:19 被阅读543次

    仿照喵神写的的清理未使用图片的工具, 里面有很详细的注释介绍
    自己写的命令行打包工具 欢迎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

    相关文章

      网友评论

        本文标题:swift 开发命令行工具

        本文链接:https://www.haomeiwen.com/subject/zexbxxtx.html