发布基于 VisionFlow 开发的软件#
以下内容仅适用于 Windows 系统。
分发方式#
基于 VisionFlow 开发的软件通常在运行时依赖 visionflow.dll 等 VisionFlow 相关的库。 为了确保用户能正常运行你的软件,你需要将 VisionFlow 一并以某种方式分发给用户。 常见的分发方式有以下三种:
独立分发:你向用户分别提供你的软件和 VisionFlow 安装程序,用户独立地安装两个软件。
集成安装程序:你将 VisionFlow 安装程序集成到你软件的安装程序中,通过命令行调用 VisionFlow 安装程序的静默安装模式。
重新打包:你将 VisionFlow 的相关文件直接打包到你的软件中,不使用 VisionFlow 安装程序。
下面的表格对比了这三种分发方式的特点,随后将作更详细的说明:
分发方式 |
分发物数量 |
用户操作难度 |
开发者工作量 |
依赖环境完整性 |
|---|---|---|---|---|
独立分发 |
至少2个 |
高 |
低 |
中 |
集成安装程序 |
1个 |
低 |
中 |
高 |
重新打包 |
1个 |
低 |
高 |
低 |
独立分发#
在这种发布方式中,你的软件分发中无需包括 VisionFlow 相关的内容。 你将所需版本的 VisionFlow 安装程序独立提供给用户,或引导用户自行下载该安装程序,单独安装 VisionFlow 环境。
为了确保用户正确安装了你所需版本的 VisionFlow 以及你需要的资源包,你需要在你的软件的文档或安装引导中说明这些要求。
这种发布方式的优点是:你的软件分发体积较小,你在分发过程中无需考虑 VisionFlow 的安装细节;
缺点是:你无法通过 1 个文件完整发布软件,用户需要额外操作来安装 VisionFlow,存在用户安装错误 VisionFlow 版本或漏装资源包的可能。
集成安装程序#
在这种发布方式中,你向用户提供自己软件的安装程序,并在安装程序中调用 VisionFlow 安装程序。
你在打包自己软件的安装程序时,将所需版本的 VisionFlow 安装程序和资源包作为数据包含在内,在安装过程中释放并调用。 VisionFlow 的安装程序提供了完全通过命令行调用的静默安装模式,你可以按照需要指定参数,并根据返回值判断安装是否成功。
这种发布方式的优点是:可以最大程度确保用户安装了你所需的 VisionFlow 环境,用户操作简单,只需运行 1 个安装程序;
缺点是:你发布的安装程序体积可能较大。
重新打包#
在这种发布方式中,你将 VisionFlow 的相关文件直接打包到你的软件中,而不使用 VisionFlow 安装程序。
你可能需要将 VisionFlow 和你所需资源包安装在你电脑的某个位置,然后从中收集你需要的文件。
我们在 VisionFlow 的安装过程中执行了一些配置操作,包括但不限于为我们的 Python 运行环境安装依赖。 打包以 tar.gz 压缩包发布的 Windows 版本 很可能 导致你依赖的 VisionFlow 不完整。
这种发布方式的优点是:用户操作简单,只需运行 1 个安装程序,且安装程序体积可能较小;
缺点是:你需要额外工作来收集和测试所需的文件,在更新 VisionFlow 版本时必须确认新版本的文件变更。
启动器#
对于上述的分发方式,除非你重新打包 VisionFlow 的相关文件,都存在以下两个问题:
用户的系统中可能安装了多个版本的 VisionFlow,且每个用户安装 VisionFlow 的路径可能不同。
将 VisionFlow 路径添加到系统环境变量 PATH 并不能帮助你的软件在运行时找到合适的 VisionFlow 库,反而可能由于顺序不可控导致加载错误的库版本。
为了解决这两个问题,我们提供了 VisionFlow 启动器工具,用以自动寻找和加载合适版本的 VisionFlow 库。
启动器的功能和原理#
启动器是为了达成这样的目的:用某个版本的 VisionFlow 开发的软件,即使用户的系统中安装了多个版本的 VisionFlow,并且路径不是默认路径, 在运行时也能够自动找到并加载与开发时相同的库版本。
Warning
启动器只能与通过安装程序安装的 VisionFlow 库一起使用。 如果你的软件采用了重新打包 VisionFlow 的分发方式,启动器不适用于你的软件。
为了达成这一目的,VisionFlow 的库文件、安装程序和启动器会配合工作。
每个版本的 VisionFlow 库文件中会带有当前版本的标记,当你的软件基于 VisionFlow 开发时,生成的二进制文件中就会包含该版本标记。 VisionFlow 安装程序会在注册表中记录当前版本的安装路径。
当用户通过启动器运行你的软件时,启动器会分析你软件的二进制文件寻找版本标记。找到标记后,启动器会查询注册表找到该版本的安装路径。
最后,启动器将该路径临时添加到环境变量 PATH 并启动你的软件,从而确保你的软件能够加载正确版本的 VisionFlow 库。
如果你的软件依赖于特定的 VisionFlow 资源包,启动器可以在启动你的软件前检查用户是否安装了它们。如果存在缺失,启动器会给出错误提示并终止运行。
在以上流程中,启动器会替代你软件原本的入口可执行文件。用户直接运行的是启动器,由启动器进行查找和加载后运行你原本的程序。
另一种情况是,你基于 VisionFlow 开发的是另一个 DLL 库。你软件的可执行文件不直接依赖 VisionFlow,而是依赖你开发的 DLL 库。 启动器无法从这样的可执行文件中找到版本标记,但能够分析出可执行文件依赖的 DLL 文件,从而在那个基于 VisionFlow 开发的 DLL 中找到版本标记。 这个过程是自动的,无需额外配置。
在比较特殊的情况下,你的可执行文件是动态地加载 VisionFlow 或基于 VisionFlow 的 DLL。 启动器可能无法从可执行文件和其依赖的 DLL 中找到版本标记。 为了解决这个问题,你可以为启动器配置一些 DLL 的路径,启动器会在这些 DLL 中也尝试寻找版本标记。 你也可以为启动器配置一个固定版本号,当启动器未能找到版本标记时就会使用该版本号。
制作和使用启动器#
启动器需要配置一些信息才能适配你的软件,这个过程可以通过我们提供的启动器生成工具来完成。
生成工具位于 VisionFlow 安装目录的 bin 目录下,名为 VisionFlowLauncherGenerator.exe。
生成工具可以通过图形界面或命令行使用。运行工具并提供需要的信息,工具会生成适用于你软件的启动器程序。
生成工具需要的信息有以下各项。图形界面会有相应的输入框,通过命令行使用时请添加相应的参数。
软件打包的根目录。命令行参数
/dir=<path>。这个目录应该是你系统中构建软件的目录路径,启动器会生成在该目录下。可执行文件路径。命令行参数
/target=<path>。这是一个相对于你软件打包根目录的路径,指向你软件的入口可执行文件。生成的启动器会用这个相对路径寻找启动目标。
提供以上两项信息就可以生成一个最基本的启动器。命令行调用的形式如:
VisionFlowLauncherGenerator.exe /dir="C:\MySoftware\build" /target="bin\MyApp.exe"
由于启动器是以相对路径来寻找你的可执行文件,在生成后,你应该确保它与你软件的可执行文件位置关系不变。 生成的启动器也可以从命令行调用,并且会将接收的参数原样传递给你的可执行文件。
为了让启动器从风格上更适配你的软件,你还可以提供以下可选信息:
启动器的文件名(可选)。命令行参数
/outfile=<name>。这是生成的启动器文件的名称,默认为VisionFlowLauncher.exe。你也可以在生成后重命名启动器。启动器的图标文件(可选)。命令行参数
/icon=<path>。这应该是你系统中一个 ico 图标文件的路径。该图标将被用于启动器,使它适配你的软件产品。
如果你需要启动器为你检查资源包安装情况,你需要提供你认为必需的资源包 ID。完整的 ID 列表可以在 资源包下载页面 查看。
必需的资源包 ID 列表(可选)。命令行参数
/res=<id>[|<id>],多个 ID 用|连接。如果启动器找到的 VisionFlow 安装缺少这些资源包,启动器会给出错误提示并终止运行。
为了适配上一节所述的特殊情况,即启动器无法从可执行文件中找到版本标记的情况,你还可以提供以下可选信息:
额外 DLL 路径列表(可选)。命令行参数
/dll=<path>[|<path>],多个路径用|分隔。这是相对于你软件打包根目录的路径,可以指向 DLL 文件或目录。如果是目录,目录中的所有 DLL 文件都是寻找目标。启动器会这些 DLL 文件中寻找版本标记。备选 VisionFlow 版本号(可选)。命令行参数
/version=<version>。格式如0.10.3-release.34c8e0ca。如果启动器未能找到版本标记,就会使用该版本号。
完整的命令行调用示例如:
VisionFlowLauncherGenerator.exe /dir="C:\MySoftware\build" /target="bin\MyApp.exe" /outfile="MyAppLauncher.exe" /icon="C:\MySoftware\resources\app_icon.ico" /res="vlm_pretrain|training_dependencies" /dll="plugins\MyPlugin.dll|libs" /version="0.10.3-release.34c8e0ca"