你首先要做一个目录来存储你的Cairo代码。对于Cairo来说,你的代码放在哪里并不重要。 但对于本书中的练习和项目来说,我们建议在你的主目录下建立一个 cairo_projects 目录,并将你的所有项目存放在这里。
打开一个终端,输入以下命令,建立一个 cairo_projects 目录 并在 cairo_projects 目录下为 "Hello, world!"项目建立一个目录。
注意:从现在起,对于书中显示的每个示例,我们都假定 你都是在 Scarb 项目目录中进行编码。如果您没有使用 Scarb,并试图从其他目录运行示例,可能需要相应调整命令或创建一个 Scarb 项目。
对于Linux、macOS和Windows上的PowerShell,输入:
mkdir ~/cairo_projects cd ~/cairo_projects对于Windows CMD,请输入以下内容:
> mkdir "%USERPROFILE%\cairo_projects" > cd /d "%USERPROFILE%\cairo_projects"让我们使用 Scarb 创建一个新项目。
导航到你的项目目录(或你决定放代码的地方)。然后运行以下命令:
scarb new hello_world 它创建了一个新的目录和项目,名为hello_world。我们把我们的项目命名为hello_world,因此Scarb会在同名的目录下创建它的文件。
用cd hello_world命令进入hello_world目录。你会看到Scarb已经为我们生成了两个文件和一个目录:一个Scarb.toml文件和一个src目录,里面有一个lib.cairo文件。
它还初始化了一个新的Git仓库和一个.gitignore文件
注意:Git是一个常见的版本控制系统。你可以通过使用--vcs标志停止使用版本控制系统。 运行scarb new -help以查看可用选项。
在你选择的文本编辑器中打开 Scarb.toml 。它看起来应该与示例1-2中的代码相似。
文件名:Scarb.toml
[package] name = "hello_world" version = "0.1.0"
[dependencies]
示例1-2:由scarb new生成的Scarb.toml的内容
这个文件是TOML(Tom's Obvious, Minimal Language)的格式,是Scarb的配置文件格式。
第一行,[package],是一个章节标题,表示下面的语句是在配置一个包。随着我们向这个文件添加更多的信息,我们将添加其他章节。
接下来的两行设置了Scarb在编译你的程序时需要的配置信息:名称和要使用的Scarb版本。
最后一行,[dependencies],是一个章节的开始,该章节供你列出你的项目的所有依赖。在Cairo中,代码包被称为crate。在这个项目中,我们不需要任何其他的crate。
注意:如果你要为Starknet构建合约,你需要添加Scarb文档中提到的starknet依赖关系。
Scarb创建的另一个文件是src/lib.cairo,让我们删除其中所有的内容,放入以下内容,我们将在后面解释原因。
mod hello_world; 然后创建一个名为src/hello_world.cairo的新文件,并将以下代码放入其中:
文件名: src/hello_world.cairo
use debug::PrintTrait; fn main() { 'Hello, World!'.print(); } 我们刚刚创建了一个名为lib.cairo的文件,其中包含一个模块声明,引用了另一个名为 hello_world的模块,以及包含 hello_world模块的实现细节的文件hello_world.cairo。
Scarb要求你的源文件位于src目录中。
顶层项目目录是为README文件、许可证信息、配置文件和任何其他与代码无关的内容保留的。 Scarb确保所有项目组件都有一个指定的位置,维持一个结构化的组织架构。
如果你启动了一个不使用Scarb的项目,你可以把它转换成一个使用Scarb的项目。将项目代码移到src目录下,并创建一个适当的Scarb.toml文件。
编译Scarb项目 在你的hello_world目录中,通过输入以下命令来编译你的项目:
$ scarb build Compiling hello_world v0.1.0 (file:///projects/Scarb.toml) Finished release target(s) in 0 seconds 这个命令在target/dev中创建了一个sierra文件,现在我们先忽略sierra文件。
如果你正确安装了Cairo,你应该能够运行并看到以下输出:
$ scarb cairo-run running hello_world ... [DEBUG] Hello, World! (raw: 0x48656c6c6f2c20776f726c6421
Run completed successfully, returning [] 无论你的操作系统如何,终端里都应该打印出字符串Hello, world!。
如果 "Hello,world!"打印出来了,那么恭喜你!你已经正式写了一个Cairo程序! 你已经成为了一名Cairo程序员--欢迎!
让我们详细回顾一下这个 "Hello,world!"程序。这里有拼图的第一部分:
fn main() { }这些代码定义了一个名为
main的函数。main函数很特别:它总是每个可执行的Cairo程序中运行的第一个代码。 这里,第一行声明了一个名为main的函数,没有参数,也不返回。如果有参数,它们会被放在括号()里。函数主体被包裹在"{}"中。Cairo要求在所有的函数体周围加上大括号 将开头的左大括号与函数声明放在同一行是很好的编码风格。 别忘了在它们中间加一个空格。
注意:如果你想在Cairo项目中使用一个统一代码风格标准,你可以 使用自动格式化工具
scarb fmt来将你的代码格式化为 特定的代码风格(更多关于scarb fmt的信息见 附录D)。Cairo团队已经将这个工具 包含在标准的Cairo发行版中,就像cairo-run一样,所以它应该已经被 已经安装在你的计算机上了!在主函数声明之前,
use debug::PrintTrait;一行负责导入另一个模块中定义的项目。在这个例子中,我们从Cairo核心库中导入了PrintTrait项目。通过这样做,我们获得了在可以打印的数据类型上使用print()方法的能力。
main函数的主体包含以下代码:'Hello, World!'.print();这一行完成了这个小程序的所有工作:将文本打印到屏幕上。这里有四个重要的细节需要注意。
首先,Cairo的风格是用四个空格缩进,而不是用制表符。
第二,调用的
print()函数是来自traitPrintTrait的一个方法。这个trait是从Cairo核心库中导入的,它定义了如何将不同数据类型的值打印到屏幕上。在我们的例子中,我们的文本被定义为 "short string",这是一个ASCII字符串,可以适合Cairo的基本数据类型,即felt252类型。通过调用'Hello, world!'.print(),我们正在调用PrintTraittrait的felt252实现的print()方法。第三,看见了
'Hello, world!'短字符串么。我们把这个短字符串作为一个参数传递给print(),因此短字符串被打印到屏幕上。第四,我们用分号(
;)来结束这一行,这表示这个表达式已经结束,下一个表达式准备开始。大多数Cairo的代码行以分号结束。要运行与特定软件包相关的所有测试,可以使用
scarb test命令。 它本身并不是一个测试运行工具,而是将测试工作委托给所选的测试工具。Scarb预装了scarb cairo-test扩展,它捆绑了Cairo的本地测试运行器。它也是scarb test默认使用的测试运行器。 要使用第三方测试运行器,请参考Scarb文档。测试函数用
#[test]属性标记,运行scarb test将运行代码库中src/目录下的所有测试函数。├── Scarb.toml ├── src │ ├── lib.cairo │ └── file.cairoScarb 项目结构示例
让我们回顾一下到目前为止我们所了解到的关于Scarb的情况:
我们可以使用
scarb new创建项目。我们可以使用
scarb build生成编译后的 Sierra 代码。我们可以在
Scarb.toml中定义自定义脚本,并使用scarb run命令调用它们。我们可以使用
scarb test命令运行测试。使用Scarb的另一个好处是,无论你在哪个操作系统上工作,命令都是一样的。所以我们将不再提供Linux和macOS与Windows的具体说明。
