Solana documentatieProgramma's ontwikkelenCodama

Clients genereren

Codama genereert TypeScript- en Rust- clients vanuit het IDL-bestand van een programma. De gegenereerde clients bevatten functies voor het aanroepen van instructies en het ophalen van accounts, waardoor het niet meer nodig is om handmatig programma-accounts of instruction data te serialiseren en deserialiseren.

Codama is in actieve ontwikkeling en onderhevig aan veranderingen. Raadpleeg de gelinkte repositories in de snelle referentie voor de meest recente informatie.

Snelle referentie

CLI-opdrachten

OpdrachtBeschrijving
codama initGenereer een codama-configuratiebestand
codama runGenereer programmaclients vanuit het configuratiebestand

Client-generators

PakketBeschrijving
@codama/renderers-jsGenereer @solana/kit compatibele TypeScript-clients
@codama/renderers-rustGenereer solana_sdk compatibele Rust-clients
@codama/nodes-from-anchorConverteer Anchor IDLs naar Codama IDLs voor het genereren van clients

Aanvullende bronnen

BronBeschrijving
CodamaCodama GitHub
Codama CLICodama CLI GitHub
Codama MacrosCodama Macros GitHub. Genereer Codama IDL vanuit native Rust-programma's met Codama-macro's
Codama Macros Example ProgramVoorbeeldprogramma dat het gebruik van Codama-macro's demonstreert

Voorbeeld

Dit voorbeeld doorloopt het proces van het genereren van clients vanuit een Anchor-programma IDL.

Project bestanden instellen

Om mee te doen, maak een nieuwe map aan genaamd example en voeg het idl.json bestand en het package.json bestand toe uit de codefragmenten.

Dit voorbeeld gebruikt een counter programma IDL. Bekijk broncode.

In een Anchor project is de IDL te vinden in target/idl/<program_name>.json na het uitvoeren van anchor build.

Maak een Codama configuratiebestand

Codama gebruikt een configuratiebestand om aan te geven waar het IDL-bestand zich bevindt, welke cliënttalen gegenereerd moeten worden en waar de gegenereerde code moet worden opgeslagen. Maak dit configuratiebestand door het volgende uit te voeren:

Terminal
$
npx codama init

Dit zal je vragen stellen om een codama.json bestand in de hoofdmap van je project aan te maken en de benodigde Codama-afhankelijkheden te installeren.

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

Genereer clients

Zodra het configuratiebestand is aangemaakt, voer je het generatie-commando uit om de clients te genereren:

Terminal
$
npx codama run --all

Dit zal de programmaclients genereren in de bestandspaden die zijn gespecificeerd in het codama-configuratiebestand.

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

Niet alle gegenereerde bestanden worden getoond in de bijbehorende codevoorbeelden.

Project bestanden instellen

Om mee te doen, maak een nieuwe map aan genaamd example en voeg het idl.json bestand en het package.json bestand toe uit de codefragmenten.

Dit voorbeeld gebruikt een counter programma IDL. Bekijk broncode.

In een Anchor project is de IDL te vinden in target/idl/<program_name>.json na het uitvoeren van anchor build.

Maak een Codama configuratiebestand

Codama gebruikt een configuratiebestand om aan te geven waar het IDL-bestand zich bevindt, welke cliënttalen gegenereerd moeten worden en waar de gegenereerde code moet worden opgeslagen. Maak dit configuratiebestand door het volgende uit te voeren:

Terminal
$
npx codama init

Dit zal je vragen stellen om een codama.json bestand in de hoofdmap van je project aan te maken en de benodigde Codama-afhankelijkheden te installeren.

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

Genereer clients

Zodra het configuratiebestand is aangemaakt, voer je het generatie-commando uit om de clients te genereren:

Terminal
$
npx codama run --all

Dit zal de programmaclients genereren in de bestandspaden die zijn gespecificeerd in het codama-configuratiebestand.

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

Niet alle gegenereerde bestanden worden getoond in de bijbehorende codevoorbeelden.

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

De gegenereerde clients gebruiken

De gegenereerde clients bevatten broncode voor interactie met je programma maar bevatten geen package.json (voor TypeScript) of Cargo.toml (voor Rust) bestanden.

Je zult nieuwe package.json en Cargo.toml bestanden moeten maken of de vereiste afhankelijkheden van de gegenereerde clients aan de bestaande bestanden van je project moeten toevoegen.

Geïntegreerd in je applicatie

Genereer de client direct in de bronmap van je applicatie en voeg vervolgens de vereiste afhankelijkheden toe aan je bestaande package.json of Cargo.toml.

Gebruik deze aanpak bij het bouwen van een applicatie waarbij de clientcode niet gedeeld of gepubliceerd hoeft te worden.

Zelfstandige packages of crates

Maak afzonderlijke TypeScript packages of Rust crates voor elke client. Voeg bijvoorbeeld package.json toe in clients/js/ en Cargo.toml in clients/rust/.

Gebruik deze aanpak om de client te publiceren als een herbruikbare bibliotheek (npm of crates.io) of om de client te delen tussen meerdere applicaties in een monorepo.

Is this page helpful?

Inhoudsopgave

Pagina Bewerken

Beheerd door

© 2025 Solana Foundation.
Alle rechten voorbehouden.
Blijf Verbonden