最近,我用Rust写了一个命令行工具(Evian-Zhang/Wispha,也可以看我相关的知乎文章Wispha – 轻松展示项目结构布局)。得益于Rust自身的特性,这个命令行工具不需要更改代码,只需要在相应的平台上编译一遍,就可以实现多平台版本。相信许多个人开发者有和我类似的经历,开发了多平台的命令行工具以后,却不知道如何分发(distribute)自己的代码,GitHub releases里面只有几个平台的光秃秃的可执行文件。我经过一番搜索,发现网络上并没有完整的全面教程。因此,在我探索了很久之后,把在Windows, macOS, Debian/Ubuntu这三个平台上打包文件以进行分发的方法汇总到了这篇文章中。
在这篇文章中,就用我这次的项目举例吧。我的项目名字叫Wispha, 可执行文件叫wispha
, 版本为v0.1.0, 我的用户名为Evian Zhang.
Windows
环境
Windows 10 1909, Visual Studio 2019
我们的目标是,把wispha.exe
打包为一个以.msi
为扩展名的Windows Installer Package. 打包的工具有很多,有微软自家推的配合Visual Studio的,也有第三方的如Wix, orca等。Wix是一款免费的开源打包工具,但是在最新的Windows上似乎并不太行(我自己安装的时候出现了对.NET framework 3.5这个老包的要求,GitHub上也有人提过issue)。而我个人也对第一方软件有执念,因此这里我主要介绍的是基于Visual Studio的微软自家的Microsoft Visual Studio Installer Projects.
首先,打开Visual Studio, 可以直接在扩展
->管理扩展
的Visual Studio Marketplace中搜到Microsoft Visual Studio Installer这个扩展。下载、安装并重启Visual Studio之后,在创建新项目中就可以看到一个叫Setup Project的项目模板。
我们把这个项目命名为wispha-installer
, 就可以创建如图所示的项目了。
首先,我们需要在解决方案资源管理器中单击wispha-installer以在下方的属性栏中设置其杂项。将Author和Manufacturer设置为Evian Zhang, ProductName设置为wispha, Version设置为0.1.0, TargetPlatform设置为x64.
然后,我们就可以注意到主体窗口了。我们可以看到,File System on Target Machine下默认有三个文件夹:Application Folder, User’s Desktop, User’s Programs Menu. 我选择的是Application Folder, 它会在安装者的C:\Program Files\Evian Zhang\wispha\
目录下安装我们的可执行文件。如果需要在别的地方安装,也可以右键File System on Target Machine, Add special Folders里面添加对应的文件夹。具体的文件夹可以参看官方文档。
我们右键Application Folder, 在Add选项中选择文件。然后选择我们的wispha.exe
加入进去即可。
然后,我们就可以直接生成我们的wispha-installer.msi
了。
最后说一句,这个Windows Installer Package虽然是官方的工具,但竟然不能提供全部的msi功能,比如说在安装时修改PATH变量等功能。这些功能,似乎只能用第三方工具如orca等完成。
macOS
鉴于macOS上App Store的尿性,我只能放弃第一方工具,使用第三方的包管理器homebrew.
首先,我们要将可执行文件wispha
打包:
tar -czf wispha-darwin.tar.gz wispha
同时,我们要求一下生成的wispha-darwin.tar.gz
的哈希值留作后用:
shasum -a 256 wispha-darwin.tar.gz
这里生成的哈希值为a294901a60afc94095a1118472393626c38a213201c4dafb70b220c7945384b4
.
接下来,我们要在GitHub的仓库里放一个含有wispha-darwin.tar.gz
的release. 然后,我们就可以通过https://github.com/Evian-Zhang/Wispha/releases/download/v0.1.0/wispha-darwin.tar.gz
来下载这个包了。
接着,我们要在GitHub上创建一个名为homebrew-wispha
的仓库。在这个仓库里新建一个目录Formula
, 在其中增加文件wispha.rb
:
# Documentation: https://docs.brew.sh/Formula-Cookbook
# https://rubydoc.brew.sh/Formula
# PLEASE REMOVE ALL GENERATED COMMENTS BEFORE SUBMITTING YOUR PULL REQUEST!
class Wispha < Formula
desc "A commandline tool for easily displaying project layout written in Rust"
homepage "https://github.com/Evian-Zhang/Wispha"
url "https://github.com/Evian-Zhang/Wispha/releases/latest/download/wispha-darwin.tar.gz"
sha256 "a294901a60afc94095a1118472393626c38a213201c4dafb70b220c7945384b4"
version "0.1.0"
def install
bin.install "wispha"
end
end
就大功告成了。
用户可以通过
brew tap Evian-Zhang/Wispha
brew install wispha
来管理、安装我们的软件。
Debian/Ubuntu
和Windows类似,我们的目标是打包成一个以.deb
结尾的包。
首先,我们要新建一个以下目录结构:
wispha
├── DEBIAN
│ └── control
└── usr
└── bin
└── wispha
其中wispha/usr/bin/wispha
就是我们的可执行文件,而control
的内容如下:
Package: wispha
Architecture: all
Maintainer: Evian Zhang
Version: 0.1.0
Description: A commandline tool for easily displaying project layout
然后,我们使用
dpkg-deb --build wispha
就可以得到想要的wispha.deb
文件啦。
参考文献
[2] https://federicoterzi.com/blog/how-to-publish-your-rust-project-on-homebrew/
[3] https://www.debian.org/doc/debian-policy/ch-controlfields.html