【问题标题】:Running Swift script with Cocoapods dependency使用 Cocoapods 依赖运行 Swift 脚本
【发布时间】:2018-01-26 10:12:27
【问题描述】:
我有一个使用 Cocoapods 的 iOS 项目。我使用的 pod 之一是 https://github.com/mattrubin/OneTimePassword。我写了一个小包装器来包装这个 pod 的功能——在我的例子中,它是在当前时间打印出密码。这一切都很好。
我想用 Swift 编写一个基本上从命令行打印的脚本。我按照这里的教程https://krakendev.io/blog/scripting-in-swift 但是当我尝试编译我的脚本时,编译器认为我的框架不可用..
这是我的脚本:
#!/usr/bin/swift
// import OneTimePassword // This is the Pod I'm trying to use. I get the error: error: no such module 'OneTimePassword'
print(MyWrapperClass.shared.printPwd()) // error: use of unresolved identifier 'MyWrapperClass'
我正在使用命令swiftc main.swift -o main进行编译
【问题讨论】:
标签:
swift
cocoa
scripting
dependencies
cocoapods
【解决方案1】:
我正在尝试做同样的事情。此页面是搜索“swift scripting cocoapods”的最佳结果,但仍然没有得到答复,这让我觉得还没有太多人尝试使用 swift 进行脚本编写。
首先,如果您正在编译代码,那么它并不是真正的脚本,而只是一个小程序。 “#!”的重点脚本中的行是这样您就可以将其标记为可执行文件(是的源文件,带有chmod a+x blah.swift),将其放在/usr/local/bin 之类的可执行路径中,在您的shell 中键入blah.swift。 swift 编译器知道为您构建然后运行它(是的,每次都重新构建它,因为 swift 不是解释器,但对小代码执行此操作并非不合理)。如果您希望键入的命令只是“blah”,则可以从 swift 文件中省略文件扩展名。
遗憾的是,似乎没有什么能像 perl 的 CPAN 那样可以将 swift 包添加到您的系统并允许在简单的可执行 swift 脚本中使用它。 Swift 包管理器和 cocoapods-rome 都假设你的脚本有一个项目源目录,有点假设一个人要构建它然后安装二进制文件(尽管这似乎有点像你期望的那样)。 编辑:我错了,下一段中提到的事情毕竟会做到这一点。
我发现非常接近的是“马拉松”https://github.com/johnsundell/marathon,它可以轻松创建、运行、调试具有依赖关系的脚本,而不会暴露其源代码和废话的目录。不幸的是,您失去了将脚本标记为可执行文件并按名称运行的简单性,您的脚本文件隐藏在某些托管位置并通过marathon run blah 命令执行。但是,shell 别名/函数可以为您隐藏那些杂乱无章的事情,而这正是我打算做的。
marathon 的作者还提供了一系列用于在 swift 中编写脚本的工具和包的链接:https://github.com/JohnSundell/SwiftScripting
编辑: 看起来特殊的 shebang 行 #!/usr/bin/env marathon run 毕竟会让人们使用裸脚本和马拉松安装的 pod/包。如果你想使用这个,7ball,然后这样做:
- 安装 marathon(嗯,自制版本已过时,请按照 Swift 包管理器说明进行操作)
- 将脚本中的 shebang 行从
#!/usr/bin/swift 更改为上述内容
- 取消注释您的“导入”行并在其后添加特殊的马拉松评论,如下所示:
import OneTimePassword // marathon:https://github.com/mattrubin/OneTimePassword.git
- (或使用
marathon add https://github.com/mattrubin/OneTimePassword.git 提前将其安装到马拉松中,并且不要在您的“导入”行中添加有趣的评论)
- 使用“./main.swift”运行