# 从 julia 文件创建独立应用程序


此示例说明了如何使用 Syslab AppBundler 将 Julia 文件打包为可部署执行文件。

注意

Syslab AppBundler 暂不支持在 Syslab Online 中使用。

# 1. 创建独立文件夹

使用 Syslab AppBundler,需要准备一个独立的文件夹,其中包含用户依赖的 jl 文件以及一些其他的资源文件。

在此示例中,创建一个 modfun 的空文件夹。

# 2. 编写可运行的 Julia 代码

在 modfun 文件夹中创建 main.jl 文件,作为打包的主文件。

要使得创建的应用程序支持命令行启动参数,需要设置 ARGS 命令行启动参数,类型为字符串数组。

代码如下:

using TyPlot
function modfun(m, n)
    axis([-1 1 -1 1])
    axis("square")
    axis("off")
    hold("on")
    z = exp.(2 * im * pi * (0:n) / n)
    for j = 0:n
        zj = [z[j+1], z[mod.(j * m, n)+1]]
        plot(real(zj), imag(zj))
    end
end

function main(ARGS)
    if length(ARGS) == 2
        m = parse(Int, ARGS[1])
        n = parse(Int, ARGS[2])
        modfun(m, n)
    # 若未传入参数,使用默认值
    elseif length(ARGS) == 0 
        modfun(105, 200)
    else
        error("错误的输入参数,需要输入两个正整数")
    end
end

# ARGS 为命令行启动参数,类型为字符串数组
main(ARGS)

# 关闭绘图窗口后,才会使进程结束
TyPlot.plt.show(block=true)

# 3. 打包用于目标的代码

在 modfun 文件中创建 build.jl 文件,用于打包 main.jl 文件为独立应用程序。

使用以下打包模板的代码,填写对应信息后后打包上述 Julia 代码:

using TyAppBundler

# app名称
app_name = "ModfunProject"

# 打包文件夹
src_dir = @__DIR__

# 目标文件夹
dest_dir = joinpath(dirname(src_dir), app_name)

# 主文件
user_file = joinpath(src_dir, "main.jl")

# 依赖函数库
deps = ["TyPlot"]

# 是否打包 runtime
has_runtime = false

# 是否创建日志文件(若创建日志文件,则输出不会在终端打印)
create_log_file = false

# 是否需要加密代码
encrypt = true

# 是否覆盖目标文件夹(如果文件夹已存在) 
force = false

# 开始构建
TyAppBundler.bundle_app(
    src_dir,
    dest_dir,
    user_file,
    deps;
    app_name=app_name,
    has_runtime=has_runtime,
    create_log_file=create_log_file,
    encrypt=encrypt,
    force=force,
)

运行 build.jl 文件进行打包,打包完成后会在目标文件夹下获得以下文件:

# 4. 运行独立应用程序

  1. 在系统命令提示符下,导航到包含独立可执行文件的文件夹;
  2. 根据您的操作系统,使用以下命令之一通过输入参量 105 和 200 运行 ModfunProject:

首次执行会进行预编译,需要等待一段时间。

Windows:

./ModfunProject.exe 105 200

Linux:

./ModfunProject.sh 105 200

运行结果:

# 5. 部署应用程序

打包好的文件夹即为最终部署产物,将该文件夹拷贝到用户指定机器即可使用,无需安装。

该示例需要依赖 Syslab 运行,若用户不想依赖 Syslab 就可运行部署应用程序,则需要在步骤 3 中,将 has_runtime 设置为 true。

注意

  • 初次运行移动文件夹后运行应用程序均需要预编译,此过程会花费一定时间,此时无需操作,等待编译结束即可;

  • 如果打包依赖了多个 jl 文件或依赖了外部资源文件,则需要将这些文件全部放在打包文件夹中,并在 jl 代码中使用相对路径进行引用;

  • 执行打包脚本需要在全局环境下进行,如果用户代码依赖了本地开发的函数库,需要将该函数库安装在全局环境中,并在打包脚本中将该函数库添加至依赖函数库中;

  • 若用户选择打包 Runtime,且打包产物中存在 miniforge3 文件夹,则打包的文件夹不能放在中文路径下,这会导致 TyPlot 无法使用。