Solana-DokumentationProgramme entwickelnCodama

Generierung von Clients

Codama generiert TypeScript- und Rust- Clients aus der IDL-Datei eines Programms. Die generierten Clients enthalten Funktionen zum Aufrufen von Anweisungen und Abrufen von Konten, wodurch die Notwendigkeit entfällt, manuell Programmkonten oder instruction data zu serialisieren und zu deserialisieren.

Codama befindet sich in aktiver Entwicklung und kann sich ändern. Informieren Sie sich in den verlinkten Repositories in der Kurzreferenz über die neuesten Informationen.

Kurzreferenz

CLI-Befehle

BefehlBeschreibung
codama initGeneriert eine Codama-Konfigurationsdatei
codama runGeneriert Programm-Clients aus der Konfigurationsdatei

Client-Generatoren

PaketBeschreibung
@codama/renderers-jsGeneriert @solana/kit kompatible TypeScript-Clients
@codama/renderers-rustGeneriert solana_sdk kompatible Rust-Clients
@codama/nodes-from-anchorKonvertiert Anchor-IDLs zu Codama-IDLs für die Generierung von Clients

Zusätzliche Ressourcen

RessourceBeschreibung
CodamaCodama GitHub
Codama CLICodama CLI GitHub
Codama MacrosCodama Macros GitHub. Generiert Codama IDL aus nativen Rust-Programmen mit Codama-Makros
Codama Macros Example ProgramBeispielprogramm, das die Verwendung von Codama-Makros demonstriert

Beispiel

Dieses Beispiel führt durch den Prozess der Generierung von Clients aus einem Anchor-Programm-IDL.

Projektdateien einrichten

Um mitzumachen, erstellen Sie ein neues Verzeichnis namens example und fügen Sie die idl.json Datei und die package.json Datei aus den Code-Snippets hinzu.

Dieses Beispiel verwendet eine Counter-Programm-IDL. Quellcode anzeigen.

In einem Anchor-Projekt befindet sich die IDL unter target/idl/<program_name>.json nach dem Ausführen von anchor build.

Codama-Konfigurationsdatei erstellen

Codama verwendet eine Konfigurationsdatei, um anzugeben, wo sich die IDL-Datei befindet, welche Client-Sprachen generiert werden sollen und wohin der generierte Code ausgegeben werden soll. Erstellen Sie diese Konfiguration durch Ausführen von:

Terminal
$
npx codama init

Dies wird Sie mit Fragen auffordern, um eine codama.json-Datei im Stammverzeichnis Ihres Projekts zu erstellen und die notwendigen Codama-Abhängigkeiten zu installieren.

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

Clients generieren

Sobald die Konfigurationsdatei erstellt wurde, führen Sie den Generierungsbefehl aus, um die Clients zu generieren:

Terminal
$
npx codama run --all

Dies generiert die Programm-Clients in den Dateipfaden, die in der Codama-Konfigurationsdatei angegeben sind.

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
}
]
}
}
}

Nicht alle generierten Dateien werden in den entsprechenden Code-Snippets angezeigt.

Projektdateien einrichten

Um mitzumachen, erstellen Sie ein neues Verzeichnis namens example und fügen Sie die idl.json Datei und die package.json Datei aus den Code-Snippets hinzu.

Dieses Beispiel verwendet eine Counter-Programm-IDL. Quellcode anzeigen.

In einem Anchor-Projekt befindet sich die IDL unter target/idl/<program_name>.json nach dem Ausführen von anchor build.

Codama-Konfigurationsdatei erstellen

Codama verwendet eine Konfigurationsdatei, um anzugeben, wo sich die IDL-Datei befindet, welche Client-Sprachen generiert werden sollen und wohin der generierte Code ausgegeben werden soll. Erstellen Sie diese Konfiguration durch Ausführen von:

Terminal
$
npx codama init

Dies wird Sie mit Fragen auffordern, um eine codama.json-Datei im Stammverzeichnis Ihres Projekts zu erstellen und die notwendigen Codama-Abhängigkeiten zu installieren.

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

Clients generieren

Sobald die Konfigurationsdatei erstellt wurde, führen Sie den Generierungsbefehl aus, um die Clients zu generieren:

Terminal
$
npx codama run --all

Dies generiert die Programm-Clients in den Dateipfaden, die in der Codama-Konfigurationsdatei angegeben sind.

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
}
]
}
}
}

Nicht alle generierten Dateien werden in den entsprechenden Code-Snippets angezeigt.

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"
}
]
}
}
]
}

Verwendung der generierten Clients

Die generierten Clients enthalten Quellcode für die Interaktion mit Ihrem Programm, aber keine package.json (für TypeScript) oder Cargo.toml (für Rust) Dateien.

Sie müssen entweder neue package.json und Cargo.toml Dateien erstellen oder die erforderlichen Abhängigkeiten aus den generierten Clients zu den bestehenden Dateien Ihres Projekts hinzufügen.

In Ihre Anwendung integriert

Generieren Sie den Client direkt in das Quellverzeichnis Ihrer Anwendung und fügen Sie dann die erforderlichen Abhängigkeiten zu Ihren bestehenden package.json oder Cargo.toml hinzu.

Verwenden Sie diesen Ansatz beim Erstellen einer Anwendung, bei der der Client-Code nicht geteilt oder veröffentlicht werden muss.

Eigenständige Pakete oder Crates

Erstellen Sie separate TypeScript-Pakete oder Rust-Crates für jeden Client. Fügen Sie zum Beispiel package.json in clients/js/ und Cargo.toml in clients/rust/ hinzu.

Verwenden Sie diesen Ansatz, um den Client als wiederverwendbare Bibliothek (npm oder crates.io) zu veröffentlichen oder den Client über mehrere Anwendungen in einem Monorepo zu teilen.

Is this page helpful?

Inhaltsverzeichnis

Seite bearbeiten

Verwaltet von

© 2025 Solana Foundation.
Alle Rechte vorbehalten.
Verbinden Sie sich