使用编译器¶
同时编译和运行¶
要同时编译和运行程序,请使用单个文件名调用 crystal run
$ echo 'puts "Hello World!"' > hello_world.cr
$ crystal run hello_world.cr
Hello World!
run 命令将源文件 hello_world.cr 编译成一个二进制可执行文件,并将其存储在临时位置,然后立即执行该文件。
创建可执行文件¶
crystal build 命令构建一个二进制可执行文件。输出文件与源文件同名,去掉扩展名 .cr。
$ crystal build hello_world.cr
$ ./hello_world
Hello World!
发布版本¶
默认情况下,生成的执行文件未经过完全优化。可以使用 --release 标志启用优化。
$ crystal build hello_world.cr --release
不使用发布模式编译速度快得多,生成的二进制文件仍然提供相当不错的性能。
发布模式构建应用于生产环境可执行文件和进行基准测试。对于简单的开发构建,通常没有必要这样做。
为了减小可分发文件的二进制文件大小,可以使用 --no-debug 标志。这将删除调试符号,从而减小文件大小,但显然会使调试变得更加困难。
创建静态链接的可执行文件¶
可以使用 --static 标志构建静态链接的可执行文件
$ crystal build hello_world.cr --release --static
注意
目前,仅在 Alpine Linux 上支持构建完全静态链接的可执行文件。
有关静态链接的更多信息,请参阅 静态链接指南。
编译器使用 CRYSTAL_LIBRARY_PATH 环境变量作为第一个查找目的地,以查找要链接的静态和动态库。这可以用于提供静态版本的库,这些库也可以用作动态库。
创建 Crystal 项目¶
crystal init 命令有助于初始化 Crystal 项目文件夹,设置基本项目结构。crystal init app <name> 用于应用程序,crystal init lib <name> 用于库。
$ crystal init app myapp
create myapp/.gitignore
create myapp/.editorconfig
create myapp/LICENSE
create myapp/README.md
create myapp/shard.yml
create myapp/src/myapp.cr
create myapp/spec/spec_helper.cr
create myapp/spec/myapp_spec.cr
Initialized empty Git repository in /home/crystal/myapp/.git/
并非所有这些文件都对每个项目都必需,有些文件可能需要更多自定义,但 crystal init 为开发 Crystal 应用程序和库创建了一个良好的默认环境。
编译器命令¶
crystal init: 生成新项目crystal build: 构建可执行文件crystal docs: 生成文档crystal env: 打印 Crystal 环境信息crystal eval: 从参数或标准输入中评估代码crystal play: 启动 Crystal 游乐场服务器crystal run: 构建并运行程序crystal spec: 构建并运行规范crystal tool: 运行编译器工具crystal clear_cache: 清除编译器缓存crystal help: 显示有关命令和选项的帮助crystal version: 显示版本
要查看特定命令的可用选项,请在命令后使用 --help
crystal run¶
run 命令将源文件编译成一个二进制可执行文件,然后立即运行该文件。
crystal [run] [<options>] <programfile> [-- <argument>...]
编译后的二进制文件参数可以用双破折号 -- 与编译器参数隔开。二进制可执行文件存储在编译和运行之间的临时位置。
示例
$ echo 'puts "Hello #{ARGV[0]?}!"' > hello_world.cr
$ crystal run hello_world.cr -- Crystal
Hello Crystal!
常用选项
-O LEVEL: 定义优化级别:0(默认)、1、2、3。有关详细信息,请参阅 优化。--release: 在发布模式下编译。等效于-O3 --single-module。--progress: 在编译期间显示进度。--static: 静态链接。
更多选项在集成帮助中描述:crystal run --help 或手册页 man crystal。
crystal build¶
crystal build 命令构建一个动态链接的二进制可执行文件。
crystal build [<options>] <programfile>
除非指定,否则生成的二进制文件将与源文件同名,去掉扩展名 .cr。
示例
$ echo 'puts "Hello #{ARGV[0]?}!"' > hello_world.cr
$ crystal build hello_world.cr
$ ./hello_world Crystal
Hello Crystal!
常用选项
--cross-compile: 生成 .o 文件,并将生成可执行文件的命令打印到标准输出。-D FLAG, --define FLAG: 定义编译时标志。-o <output_file>: 定义二进制可执行文件的名称。-O LEVEL: 定义优化级别:0(默认)、1、2、3。有关详细信息,请参阅 优化。--release: 在发布模式下编译。等效于-O3 --single-module。--link-flags FLAGS: 传递给链接器的附加标志。--no-debug: 跳过任何符号调试信息,从而减小输出文件大小。--progress: 在编译期间显示进度。--static: 静态链接。--verbose: 显示执行的命令。
更多选项在集成帮助中描述:crystal build --help 或手册页 man crystal。
crystal eval¶
crystal eval 命令从命令行或标准输入中读取 Crystal 源代码,将其编译成一个二进制可执行文件,然后立即运行该文件。
crystal eval [<options>] [<source>]
如果未提供 source 参数,则 Crystal 源代码将从标准输入中读取。二进制可执行文件存储在编译和运行之间的临时位置。
示例
$ crystal eval 'puts "Hello World"'
Hello World!
$ echo 'puts "Hello World"' | crystal eval
Hello World!
注意
在交互式运行时,通常可以通过键入传输结束字符 (Ctrl+D) 来关闭标准输入。
常用选项
-o <output_file>: 定义二进制可执行文件的名称。-O LEVEL: 定义优化级别:0(默认)、1、2、3。有关详细信息,请参阅 优化。--release: 在发布模式下编译。等效于-O3 --single-module。--no-debug: 跳过任何符号调试信息,从而减小输出文件大小。--progress: 在编译期间显示进度。--static: 静态链接。
更多选项在集成帮助中描述:crystal eval --help 或手册页 man crystal。
crystal version¶
crystal version 命令打印 Crystal 版本、LLVM 版本和默认目标三元组。
crystal version
示例
$ crystal version
Crystal 1.14.0 [dacd97bcc] (2024-10-09)
LLVM: 18.1.6
Default target: x86_64-unknown-linux-gnu
crystal init¶
crystal init 命令用于初始化一个 Crystal 项目文件夹。
crystal init (lib|app) <name> [<dir>]
第一个参数可以是 lib 或者 app。lib 表示一个可重用的库,而 app 表示一个不打算作为依赖项使用的应用程序。库的代码仓库中没有 shard.lock 文件,shard.yml 中也没有构建目标,但它包含关于如何使用它的依赖项的说明。
示例
$ crystal init lib my_cool_lib
create my_cool_lib/.gitignore
create my_cool_lib/.editorconfig
create my_cool_lib/LICENSE
create my_cool_lib/README.md
create my_cool_lib/shard.yml
create my_cool_lib/src/my_cool_lib.cr
create my_cool_lib/spec/spec_helper.cr
create my_cool_lib/spec/my_cool_lib_spec.cr
Initialized empty Git repository in ~/my_cool_lib/.git/
crystal docs¶
crystal docs 命令从 Crystal 文件中的内联文档字符串生成 API 文档(参见 代码文档)。
crystal docs [--output=<output_dir>] [--canonical-base-url=<url>] [<source_file>...]
该命令在 output_dir(默认值为 ./docs)中创建一个静态网站,该网站包含每个 Crystal 类型的 HTML 文件,其文件夹结构反映了 Crystal 的命名空间。入口点 docs/index.html 可以通过任何 Web 浏览器打开。整个 API 文档也存储在 $output_dir/index.json 中的 JSON 文档中。
默认情况下,./src 中的所有 Crystal 文件将被附加(即 src/**/*.cr)。为了考虑加载顺序依赖关系,可以使用 source_file 指定一个(或多个)文档生成器的入口点。
crystal docs src/my_app.cr
常用选项
--project-name=NAME:设置项目名称。默认值从shard.yml中提取(如果存在)。如果没有找到默认值,则此选项为必选项。--project-version=VERSION:设置项目版本。默认值从当前 Git 提交或shard.yml中提取(如果存在)。如果没有找到默认值,则此选项为必选项。--output=DIR, -o DIR:设置输出目录(默认:./docs)--canonical-base-url=URL, -b URL:设置 规范基址 URL
对于上面的示例,要将文档输出到 public,并使用自定义的规范基址 URL,以及入口点 src/my_app.cr,可以使用以下参数
crystal docs --output public --canonical-base-url http://example.com/ src/my_app.cr
crystal env¶
crystal env 命令打印 Crystal 使用的环境变量。
crystal env [<var>...]
默认情况下,它以 shell 脚本的形式打印信息。如果提供了一个或多个 var 参数,则每个命名变量的值将单独打印在一行上。
示例
$ crystal env
CRYSTAL_CACHE_DIR=/home/crystal/.cache/crystal
CRYSTAL_PATH=lib:/usr/bin/../share/crystal/src
CRYSTAL_VERSION=1.9.0
CRYSTAL_LIBRARY_PATH=/usr/bin/../lib/crystal
CRYSTAL_LIBRARY_RPATH=''
CRYSTAL_OPTS=''
$ crystal env CRYSTAL_VERSION
1.9.0
crystal spec¶
crystal spec 命令编译并运行 Crystal 规格套件。
crystal spec [<options>] [<file>[:line] | <folder>]... [-- [<runner_options>]]
所有 files 参数都将连接成一个 Crystal 源代码。如果参数指向一个文件夹,则该文件夹(及其递归子文件夹)内所有名为 *_spec.cr 的规格文件将被附加。如果未提供 files 参数,则默认为 ./spec 文件夹。文件名可以后缀为 : 和行号,将此位置提供给 --location 运行器选项(见下文)。
运行 crystal spec --options 以查看可用的前缀选项。
运行器选项
runner_options 提供给编译后的二进制可执行文件,该文件运行规格。它们应该用双破折号 (--) 与其他参数隔开。
--verbose,-v:打印详细输出,包括所有示例名称。--profile,-p:打印 10 个最慢的规格。--fail-fast:在第一个失败时中止规格运行。--junit_output <output_dir>:生成 JUnit XML 输出。--tap:为 测试任何协议 (TAP) 生成输出。--(no-)color:启用 ANSI 彩色输出。默认模式会自动启用颜色,如果 STDOUT 是 TTY 的话。--order <mode>:按给定顺序运行示例。<mode>可以是default(定义顺序)、random或数字种子值。默认值为default。--list-tags:列出所有定义的标签并退出。--dry-run:通过所有测试,但实际上不执行它们。--help,-h:打印帮助信息并退出。
以下运行器选项可以组合起来过滤要运行的规格列表。
--example <name>,-e <name>:运行其完整嵌套名称包含<name>的示例。--line <line>,-l <line>:运行其行与<line>匹配的示例。--location <file>:<line>:运行<file>中<line>处的示例(允许使用多个选项)。--tag <tag>:运行具有指定标签的示例,或通过在标签前添加~来排除示例(允许使用多个选项)。--tag a --tag b将包含标记为a或b的规格。--tag ~a --tag ~b将包含未标记为a且未标记为b的规格。--tag a --tag ~b将包含标记为a但未标记为b的规格。
示例
$ crystal spec
F
Failures:
1) Myapp works
Failure/Error: false.should eq(true)
Expected: true
got: false
# spec/myapp_spec.cr:7
Finished in 880 microseconds
1 examples, 1 failures, 0 errors, 0 pending
Failed examples:
crystal spec spec/myapp_spec.cr:6 # Myapp works
crystal play¶
crystal play 命令启动一个 Web 服务器,该服务器提供一个交互式 Crystal 游乐场。
crystal play [--port <port>] [--binding <host>] [--verbose] [file]

crystal tool¶
crystal tool context:显示给定位置的上下文crystal tool dependencies:显示所需源文件的树crystal tool expand:显示给定位置的宏展开crystal tool flags:打印所有宏flag?值crystal tool format:格式化 Crystal 文件crystal tool hierarchy:显示类型层次结构crystal tool implementations:显示给定位置中调用的实现crystal tool types:显示主要变量的类型crystal tool unreachable:显示从未调用的方法。
crystal tool dependencies¶
显示所需源文件的树。
crystal tool dependencies [options] [programfile]
选项
-D FLAG,--define FLAG:定义一个编译时标志。这对于根据编译时可用的标志有条件地定义类型、方法或命令非常有用。默认标志来自使用--target-triple给定的目标三元组,或者如果没有给定目标三元组,则来自主机的默认值。-f FORMAT,--format FORMAT:输出格式tree(默认)、flat、dot或mermaid。-i PATH,--include PATH:在输出中包含路径。-e PATH,--exclude PATH:在输出中排除路径。--verbose:显示跳过的路径和过滤路径的开头--error-trace:显示完整的错误跟踪。-h,--help:显示此消息--prelude PATH:指定要使用的序言。默认序言初始化垃圾收集器。您也可以使用--prelude=empty来不使用任何序言。这对于检查特定源代码文件的代码生成很有用。-s,--stats:启用统计信息输出-p,--progress:启用进度输出-t,--time:启用执行时间输出--stdin-filename:从 STDIN 读取的源文件名
crystal tool format¶
crystal tool format 命令将默认格式应用于 Crystal 源文件。
crystal tool format [--check] [<path>...]
path 可以是文件或文件夹名称,并包含该文件夹树中的所有 Crystal 文件。省略 path 等同于指定当前工作目录。
格式化程序也应用于注释中的 Crystal 代码块(参见 代码文档)。
crystal tool unreachable¶
显示从未调用的方法。
crystal tool unreachable [options] [programfile]
文本输出是包含以制表符分隔的列的行的列表。
输出字段
count:所有对该方法的调用的总和(仅在使用--tallies选项时;否则跳过)location:路径名、行号和列号,全部用冒号分隔namelines:def 的长度(以行数计)annotations
选项
-D FLAG,--define FLAG:定义一个编译时标志-f FORMAT,--format FORMAT:输出格式text(默认)、json或csv--tallies:也打印可达到的方法及其调用次数。--check:如果存在任何不可达代码,则以错误退出。--error-trace:显示完整的错误跟踪-h,--help:显示此消息-i PATH,--include PATH:包含路径-e PATH,--exclude PATH:排除路径(默认:lib)--no-color:禁用彩色输出--prelude PATH:使用给定文件作为序言-s,--stats:启用统计信息输出-p,--progress:启用进度输出-t,--time:启用执行时间输出--stdin-filename:从 STDIN 读取的源文件名
crystal clear_cache¶
清除位于 CRYSTAL_CACHE_DIR 的编译器缓存。
优化¶
优化级别指定生成最佳代码的代码生成工作量。它是编译性能(每个优化级别降低)和运行时性能(每个优化级别提高)之间的权衡。
生产构建通常应该具有最高的优化级别。使用 --release 可以获得最佳效果,它也意味着 --single-module。
-O0:无优化(默认)-O1:低优化-O2:中等优化-O3:高优化
环境变量¶
如果在环境中设置了以下环境变量,则 Crystal 编译器将使用它们。否则编译器将使用默认值填充它们。可以使用 crystal env 检查它们的值。
CRYSTAL_CACHE_DIR:定义 Crystal 缓存部分编译结果以加快后续构建速度的路径。此路径还用于在使用crystal run而不是crystal build运行 Crystal 程序时临时存储可执行文件。默认值为以下路径中第一个存在的或可以创建的目录:${XDG_CACHE_HOME}/crystal(如果定义了XDG_CACHE_HOME)、${HOME}/.cache/crystal、${HOME}/.crystal、./.crystal。如果CRYSTAL_CACHE_DIR已设置,但指向不可写的路径,则将使用默认值。CRYSTAL_PATH:定义 Crystal 搜索所需文件的路径。CRYSTAL_VERSION只能作为crystal env的输出使用。编译器既不设置也不读取它。CRYSTAL_LIBRARY_PATH:编译器使用此变量中的路径作为静态和动态库的第一个查找目的地,这些库将要链接。例如,如果静态库放在build/libs中,则相应地设置环境变量将告诉编译器在那里查找库。
编译器符合 NO_COLOR 规范,并在环境变量 NO_COLOR 存在时(具有非空字符串的值)关闭终端中的 ANSI 彩色转义码。