Solana 文档开发程序Codama

生成客户端

Codama 从程序的 IDL 文件生成 TypeScript 和 Rust 客户端。生成的客户端包括调用指令和获取账户的函数,省去了手动序列化和反序列化程序账户或指令数据的需求。

Codama 正在积极开发中,可能会发生变化。请参考快速参考中的链接仓库以获取最新信息。

快速参考

CLI 命令

命令描述
codama init生成一个 Codama 配置文件
codama run从配置文件生成程序客户端

客户端生成器

描述
@codama/renderers-js生成与 @solana/kit 兼容的 TypeScript 客户端
@codama/renderers-rust生成与 solana_sdk 兼容的 Rust 客户端
@codama/nodes-from-anchor将 Anchor IDL 转换为 Codama IDL 以生成客户端

其他资源

资源描述
CodamaCodama GitHub
Codama CLICodama CLI GitHub
Codama MacrosCodama Macros GitHub。使用 Codama 宏从原生 Rust 程序生成 Codama IDL
Codama Macros Example Program展示 Codama 宏用法的示例程序

示例

此示例演示了从 Anchor 程序 IDL 生成客户端的过程。

设置项目文件

要跟随操作,请创建一个名为 example 的新目录,并添加 idl.json 文件和 package.json 文件,这些文件来自代码片段。

此示例使用了一个计数器程序 IDL。 查看源码

在 Anchor 项目中,运行 anchor build 后,IDL 位于 target/idl/<program_name>.json

创建 Codama 配置文件

Codama 使用配置文件来指定 IDL 文件的位置、要生成的客户端语言以及生成代码的输出位置。通过运行以下命令创建此配置:

Terminal
$
npx codama init

这将提示您回答一些问题,以在项目根目录中创建一个 codama.json 文件,并安装必要的 Codama 依赖项。

example output
Welcome to Codama!
Where is your IDL located? (Supports Codama and Anchor IDLs). … idl.json
Which script preset would you like to use? › Generate JavaScript client, Generate Rust client
[js] Where should the JavaScript code be generated? … clients/js/src/generated
[rust] Where is the Rust client crate located? … clients/rust
[rust] Where should the Rust code be generated? … clients/rust/src/generated
Your configuration requires additional dependencies.
Install command: pnpm install @codama/nodes-from-anchor @codama/renderers-js @codama/renderers-rust
Install dependencies? … yes
Installing
├─ @codama/nodes-from-anchor
├─ @codama/renderers-js
└─ @codama/renderers-rust
Dependencies installed successfully.
Configuration file created.
└─ Path: /example/codama.json

生成客户端

配置文件创建完成后,运行生成命令以生成客户端:

Terminal
$
npx codama run --all

这将在 codama 配置文件中指定的 文件路径 中生成程序客户端。

codama.json
{
"idl": "idl.json",
"before": [],
"scripts": {
"js": {
"from": "@codama/renderers-js",
"args": ["clients/js/src/generated"]
},
"rust": {
"from": "@codama/renderers-rust",
"args": [
"clients/rust/src/generated",
{
"crateFolder": "clients/rust",
"formatCode": true
}
]
}
}
}
并非所有生成的文件都显示在相应的代码片段中。

设置项目文件

要跟随操作,请创建一个名为 example 的新目录,并添加 idl.json 文件和 package.json 文件,这些文件来自代码片段。

此示例使用了一个计数器程序 IDL。 查看源码

在 Anchor 项目中,运行 anchor build 后,IDL 位于 target/idl/<program_name>.json

创建 Codama 配置文件

Codama 使用配置文件来指定 IDL 文件的位置、要生成的客户端语言以及生成代码的输出位置。通过运行以下命令创建此配置:

Terminal
$
npx codama init

这将提示您回答一些问题,以在项目根目录中创建一个 codama.json 文件,并安装必要的 Codama 依赖项。

example output
Welcome to Codama!
Where is your IDL located? (Supports Codama and Anchor IDLs). … idl.json
Which script preset would you like to use? › Generate JavaScript client, Generate Rust client
[js] Where should the JavaScript code be generated? … clients/js/src/generated
[rust] Where is the Rust client crate located? … clients/rust
[rust] Where should the Rust code be generated? … clients/rust/src/generated
Your configuration requires additional dependencies.
Install command: pnpm install @codama/nodes-from-anchor @codama/renderers-js @codama/renderers-rust
Install dependencies? … yes
Installing
├─ @codama/nodes-from-anchor
├─ @codama/renderers-js
└─ @codama/renderers-rust
Dependencies installed successfully.
Configuration file created.
└─ Path: /example/codama.json

生成客户端

配置文件创建完成后,运行生成命令以生成客户端:

Terminal
$
npx codama run --all

这将在 codama 配置文件中指定的 文件路径 中生成程序客户端。

codama.json
{
"idl": "idl.json",
"before": [],
"scripts": {
"js": {
"from": "@codama/renderers-js",
"args": ["clients/js/src/generated"]
},
"rust": {
"from": "@codama/renderers-rust",
"args": [
"clients/rust/src/generated",
{
"crateFolder": "clients/rust",
"formatCode": true
}
]
}
}
}
并非所有生成的文件都显示在相应的代码片段中。
idl.json
package.json
{
"address": "8PY1q5J3Aq2z7TBDLBrVjv77mYzjXSCz6iHQaFEFw9hY",
"metadata": {
"name": "counter",
"version": "0.1.0",
"spec": "0.1.0",
"description": "Created with Anchor"
},
"instructions": [
{
"name": "decrement",
"discriminator": [106, 227, 168, 59, 248, 27, 150, 101],
"accounts": [
{
"name": "user",
"writable": true,
"signer": true
},
{
"name": "counter",
"writable": true,
"pda": {
"seeds": [
{
"kind": "const",
"value": [99, 111, 117, 110, 116, 101, 114]
}
]
}
},
{
"name": "vault",
"writable": true,
"pda": {
"seeds": [
{
"kind": "const",
"value": [118, 97, 117, 108, 116]
},
{
"kind": "account",
"path": "user"
}
]
}
},
{
"name": "system_program",
"address": "11111111111111111111111111111111"
}
],
"args": []
},
{
"name": "increment",
"discriminator": [11, 18, 104, 9, 104, 174, 59, 33],
"accounts": [
{
"name": "user",
"writable": true,
"signer": true
},
{
"name": "counter",
"writable": true,
"pda": {
"seeds": [
{
"kind": "const",
"value": [99, 111, 117, 110, 116, 101, 114]
}
]
}
},
{
"name": "vault",
"writable": true,
"pda": {
"seeds": [
{
"kind": "const",
"value": [118, 97, 117, 108, 116]
},
{
"kind": "account",
"path": "user"
}
]
}
},
{
"name": "system_program",
"address": "11111111111111111111111111111111"
}
],
"args": []
}
],
"accounts": [
{
"name": "Counter",
"discriminator": [255, 176, 4, 245, 188, 253, 124, 25]
}
],
"errors": [
{
"code": 6000,
"name": "UnderflowError",
"msg": "Counter cannot be decremented below zero"
}
],
"types": [
{
"name": "Counter",
"type": {
"kind": "struct",
"fields": [
{
"name": "count",
"type": "u64"
}
]
}
}
]
}

使用生成的客户端

生成的客户端包括与您的程序交互的源代码,但不包括 package.json(适用于 TypeScript)或 Cargo.toml(适用于 Rust)文件。

您需要创建新的 package.jsonCargo.toml 文件,或者将生成的客户端中的必要依赖项添加到您项目的现有文件中。

集成到您的应用程序中

将客户端直接生成到您的应用程序源目录中,然后将必要的依赖项添加到现有的 package.jsonCargo.toml 中。

在构建客户端代码不需要共享或发布的应用程序时使用此方法。

独立的包或 Crates

为每个客户端创建单独的 TypeScript 包或 Rust crate。例如,在 clients/js/ 中添加 package.json,在 clients/rust/ 中添加 Cargo.toml

使用此方法将客户端作为可重用的库(npm 或 crates.io)发布,或在单一代码库中跨多个应用程序共享客户端。

Is this page helpful?

Table of Contents

Edit Page

管理者

©️ 2025 Solana 基金会版权所有
取得联系