Feature Flags & cfg
Use recursos do Cargo e #[cfg(feature = ...)] para controlar logs de depuração, instruções exclusivas para desenvolvimento e código específico de cluster em programas Anchor.
Busque em todas as páginas da documentação
Use recursos do Cargo e #[cfg(feature = ...)] para controlar logs de depuração, instruções exclusivas para desenvolvimento e código específico de cluster em programas Anchor.
[features]
default = []
debug-log = []
devnet-only = []#[cfg(feature = "debug-log")]
msg!("debug");Quando usar isso: Você precisa de builds diferentes para dev vs mainnet ou diagnósticos opcionais.
Controle a instrução, não o módulo #[program]. Dois módulos cfg-selecionados com o mesmo nome são frágeis e fáceis de errar; um único módulo com um manipulador com cfg compilado limpa e mantém uma forma de IDL por build.
use anchor_lang::prelude::*;
declare_id!("Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS");
#[program]
pub mod my_program {
use super::*;
pub fn settle(_ctx: Context<Settle>) -> Result<()> {
Ok(())
}
/// Compilado inteiramente, a menos que `--features devnet-only`.
#[cfg(feature = "devnet-only")]
pub fn airdrop_test_tokens(_ctx: Context<Airdrop>) -> Result<()> {
Ok(())
}
}
#[derive(Accounts)]
pub struct Settle<'info> {
pub authority: Signer<'info>,
}
#[cfg(feature = "devnet-only")]
#[derive(Accounts)]
pub struct Airdrop<'info> {
pub authority: Signer<'info>,
}O que isso demonstra:
Accounts juntos, não o módulo #[program]Dividir módulos #[program] por cfg altera o IDL entre builds. Prefira crates de desenvolvimento separados ou instruções protegidas por chaves de administrador em vez de enviar instruções de dev para mainnet.
Use constantes em Anchor.toml / scripts de build em vez de múltiplos módulos #[program] quando possível.
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| Crate de programa de dev separado | Separação clara | Flags de recursos em um único crate |
| Gate de admin em tempo de execução | Mesmo binário | Remoção em tempo de compilação |
0.32.1 em tópicos avançados.
Layouts fixos grandes quando Borsh CU é muito alto.
Não facilmente; planeje o crescimento futuro.
Não; documente separadamente.
JSON do IDL do chamador em tempo de compilação.
Sim, com metadados de conta corretos.
Evite IDLs diferentes por recurso na mainnet.
LiteSVM, Surfpool, simulação em devnet.
Não; último recurso.
Veja os links relacionados para recursos.
Versões da Stack: Esta página foi escrita para Agave 4.1.1, Solana CLI 3.0.10, Anchor 0.32.1, anchor-lang 0.32.1, Rust 1.91.1, @solana/kit 7.0.0, Surfpool 0.12.0, e LiteSVM 0.6.x.
Revisado por Chris St. John·Última atualização: 19 de jul. de 2026