运行在 Linux 平台的开源 Swift

Swift 开源了,喜大普奔之后,我们发现它现在变成跨平台的了,开源后的 Swift 不止能运行在 MAC 和 iOS 平台,现在也可以运行在 Linux 平台了。我们现在就来看看 Linux 上的 Swift。

安装 Linux 环境

swift.org 网站上面提供了在 Linux 上面安装 Swift 环境的完整指引。当前 Swift 支持 Ubuntu 15.10 和 Ubuntu 14.04 两个版本。

如果你已经安装好 Ubuntu 环境了,就可以跳过这一节,继续后面内容。

如果要运行 Linux 版本的 Swift,首先你需要一个 Linux 环境,如果你自己有 Linux 服务器,它可以作为运行环境,或者你有一台装有 Linux 系统的电脑,也可以将它作为运行环境。

  1. VirtualBox

当然,更加普遍的情况应该是通过虚拟机来运行 Linux,我们可以使用 VirtualBox 作为虚拟机环境。

我们可以在 VirtualBox 的下载页面进行下载: https://www.virtualbox.org/wiki/Downloads

打开页面后,根据自己电脑的平台,下载相应的版本。

下载完成后,按照安装指引将 VirtualBox 安装好。

现在,虚拟机环境安装好了,我们还要给这个虚拟机安装一个操作系统,也就是我们需要的 Ubuntu。

  1. Vagrant

之前用过虚拟机的同学可能想到,先去 Ubuntu 网站下载一个镜像,然后挂载到虚拟机中,这是一个比较通用的做法。

当然我们还可以用一个更加简便的方法,那就是 Vagrant

Vagrant 是 VirtualBox 的一个命令行工具,可以帮助我们快速配置和部署 VirtualBox 主机。 我们可以在这里下载 Vagrant 的安装程序:https://www.vagrantup.com/downloads.html

Vagrant 通过一个名为 Vagrantfile 的文件来进行虚拟机的部署操作,这个文件存存储的是一段脚本,用来声明我们的部署任务。

接下来,创建一个文件夹作为我们的虚拟机目录,然后在这个文件夹中创建一个 Vagrantfile 文件:

Vagrant.configure(2) do |config|

  config.vm.box = "https://cloud-images.ubuntu.com/vagrant/trusty/20151201/trusty-server-cloudimg-amd64-vagrant-disk1.box"
 
  config.vm.provision "shell", inline: <<-SHELL

    sudo apt-get --assume-yes install clang
    curl -O https://swift.org/builds/ubuntu1404/swift-2.2-SNAPSHOT-2015-12-01-b/swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04.tar.gz
    tar zxf swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04.tar.gz  
    echo "export PATH=/home/vagrant/swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04/usr/bin:\"${PATH}\"" >> .profile
  SHELL
end

创建好之后,我们可以在这个目录下,运行命令进行安装了:

vagrant up

接下来,vagrant 就会帮我们进行虚拟机环境的安装部署了,安装过程需要一些时间,取决于你的网速。这段时间我们正好来分析一下 Vagrantfile 脚本的内容。

  1. 这个脚本第一步会帮助我们下载 Ubuntu 的安装包,通过这行配置信息:
config.vm.box = "https://cloud-images.ubuntu.com/vagrant/trusty/20151201/trusty-server-cloudimg-amd64-vagrant-disk1.box"

我们通过 config.vm.box 配置了 Ubuntu 安装包所在的位置,我们这里的 URL 指向的是 Ubuntu LTS 14.04 的镜像文件。当然,你还可以切换成其他的镜像源,访问 https://cloud-images.ubuntu.com/vagrant 可以查看现有的 vagrant 安装镜像的列表,可以进行自由选择(注意:Swift 目前支持 Ubuntu 14.04 和 Ubuntu 15.10 两个版本)。

  1. 镜像安装完成后,我们接下来指定了系统启动后执行的配置脚本:
config.vm.provision "shell", inline: <<-SHELL
## shells
SHELL

在一对 <<-SHELLSHELL 中,就是我们要运行的配置脚本了,首先我们运行:

sudo apt-get --assume-yes install clang

这个命令,来安装 clang 编译器,这个是苹果公司提供的 C 编译器,是 Swift 必需的一个组件。

接下来通过 curl 命令来下载 Swift 包:

curl -O https://swift.org/builds/ubuntu1404/swift-2.2-SNAPSHOT-2015-12-01-b/swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04.tar.gz

我们脚本中得 Swift 包下载地址来自 https://swift.org/download 这个页面,也可以根据你自己的需求配置需要下载的包。

接下来的 tar 命令,用于将下载完成的 Swift 包解压出来:

tar zxf swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04.tar.gz

最后,将 Swift 的 bin 目录写入环境变量,这样系统就可以找到我们要执行的命令了:

echo "export PATH=/home/vagrant/swift-2.2-SNAPSHOT-2015-12-01-b-ubuntu14.04/usr/bin:\"${PATH}\"" >> .profile

安装配置完成后,我们输入如下命令进入 Ubuntu 的命令行:

vagrant ssh

进入命令行后,可以输入 swift --version 命令验证 Swift 是否安装成功。

如果安装成功,我们就可以收到类似这样的输出:

Swift version 2.2-dev (LLVM 46be9ff861, Clang 4deb154edc, Swift 778f82939c)

开始使用 Linux 平台上的 Swift

好了, Swift 安装成功了,我们可以开始创建我们的第一个程序了,按照惯例,自然是 Hello World 程序。

使用 vim helloworld.swift 命令创建一个源文件。

然后在 Vim 中输入 i 进入插入模式,在源文件中输入:

print("Hello, world")

代码写完啦,我们按下 Esc 进入操作模式,然后输入 :wq 保存退出。

源文件创建好之后,我们可以使用 swiftc 命令编译我们的代码。

swiftc helloworld.swift

编译好之后,我们使用 ls 命令查看一下当前目录的内容,除了 helloworld.swift 文件,编译器为我们生成了一个 helloworld 可执行文件。我们可以运行这个文件:

./helloworld
Hello, world

运行成功了, 一个完整的程序,从代码到编译成功如此的简单,有没有很爽的感觉~,Swift 程序不需要导入很多基础的库,也不需要写任何的 main 函数,默认会将外层语句作为程序的入口,这些都融入了现代化的开发思维。

当然,Swift 能做的事情远远不止 Hello World 这么简单,Swift 开源的意义不只是能让我们在 Linux 开发和编译 Swift 程序,也不是能让我们看到 Swift 的源代码。开源的意义更多在于它提供的社区化功能,能让我们充分共享每个人的开发成果。就像是 NodeJS 社区一样,相信使用过 NodeJS 的开发者都会有这样的感觉 - 比如你的项目需要一个图片处理功能,去 NodeJS 的包管理社区 npmjs.com 上面找一下,马上就能找到相应的第三方库解决这个问题。而且这些第三方库几乎是和你的项目无缝集成的,这才是开源社区给予我们最大的力量。

使用 Swift 包管理

同样,开源的 Swift 也提供了包管理平台,相信今后无论你使用 Swift 开发一款 iOS APP, 甚至是一个 Linux 服务端程序,你都能够很快的在包管理平台上找到快速解决问题的第三方库。

下面我们就来看看如何使用 Swift 的包管理系统。Swift 开源社区在 Github 上提供了一个例子说明了这个问题,首先我们在 Ubuntu 上面安装 git 命令工具:

sudo apt-get --assume-yes install git

安装成功后,将 Swift 包管理的示例从 Github 上面复制出来:

git clone https://github.com/apple/example-package-dealer.git

复制成功后,我们用 ls 命令看到这个包里面有 4 个文件:

CONTRIBUTING.md  
Package.swift  
README.md  
main.swift

其中 main.swift 是程序的代码文件,而 Package.swift 就是包管理文件,我们来看一下 Package.swift 的内容:

import PackageDescription

let package = Package(
    name: "Dealer",
    dependencies: [
        .Package(url: "https://github.com/apple/example-package-deckofplayingcards.git", majorVersion: 1),
    ]
)

这里面定义了我们这个包的名称: name: "Dealer", 然后还定义了它的依赖关系, 它依赖于另外一个代码库:

https://github.com/apple/example-package-deckofplayingcards.git

通过 Package.swift 的定义,swift build 命令就可以根据相应的依赖关系,自动为我们的项目抓取那些需要的第三方库。

我们现在可以运行 build 命令:

swift build

可以看到,swift build 正在替我们把各种项目的依赖关系处理了一遍:

Cloning Packages/example-package-deckofplayingcards
Cloning Packages/example-package-fisheryates
Cloning Packages/example-package-playingcard
Compiling Swift Module 'FisherYates' (1 sources)
Linking Library:  .build/debug/FisherYates.a
Compiling Swift Module 'PlayingCard' (3 sources)
Linking Library:  .build/debug/PlayingCard.a
Compiling Swift Module 'DeckOfPlayingCards' (1 sources)
Linking Library:  .build/debug/DeckOfPlayingCards.a
Compiling Swift Module 'Dealer' (1 sources)
Linking Executable:  .build/debug/Dealer

从输出可以看到,我们复制出来的这个项目的依赖项目,又依赖了其他的项目,形成了一个依赖链条。

swift build 命令运行完成自后,我们会发现项目的根目录中多了一个 Packages 目录,这个目录里面存放了我们抓取下来的依赖项目:

+ Packages 
|   example-package-deckofplayingcards-1.0.2
|   example-package-fisheryates-1.0.2
|   example-package-playingcard-1.0.1

这个就是 Swift 包管理系统的基本概念了。

结语

相信关于包管理,我们应该并不陌生,Swift 包管理和 CocoaPods,Carthage 这些我们常用的包管理工具很类似,随让Swift 包管理工具不是第一个,但这确是苹果公司的第一次,相信开源后的 Swift 会更加壮大。如果你需要更多的了解包管理,还可以参考这些内容:

Carthage 包管理工具,另一种敏捷轻快的 iOS & MAC 开发体验
当 Swift 遇上 CocoaPods

更多精彩内容可关注微信公众号:
swift-cafe

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

推荐阅读更多精彩内容