Feature Flags & cfg
Usa features de Cargo y #[cfg(feature = ...)] para controlar logs de depuración, instrucciones solo para desarrollo y código específico del clúster en programas de Anchor.
Busca en todas las páginas de la documentación
Usa features de Cargo y #[cfg(feature = ...)] para controlar logs de depuración, instrucciones solo para desarrollo y código específico del clúster en programas de Anchor.
[features]
default = []
debug-log = []
devnet-only = []#[cfg(feature = "debug-log")]
msg!("debug");Cuándo usar esto: Necesitas diferentes compilaciones para desarrollo vs mainnet o diagnósticos opcionales.
Limita la instrucción, no el módulo #[program]. Dos módulos con el mismo nombre seleccionados por cfg son frágiles y fáciles de hacer mal; un solo módulo con un manejador limitado por cfg compila limpiamente y mantiene una forma de IDL por compilación.
use anchor_lang::prelude::*;
declare_id!("Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS");
#[program]
pub mod my_program {
use super::*;
pub fn settle(_ctx: Context<Settle>) -> Result<()> {
Ok(())
}
/// Compilado completamente fuera a menos que se use `--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>,
}Lo que esto demuestra:
Accounts juntos, no el módulo #[program]Dividir módulos #[program] por cfg cambia el IDL entre compilaciones. Prefiere crates de desarrollo separados o instrucciones detrás de claves de administrador en lugar de enviar instrucciones de desarrollo a mainnet.
Usa constantes en Anchor.toml / scripts de compilación en lugar de múltiples módulos #[program] cuando sea posible.
devnet-only en mainnet - Superficie de ataque adicional. Solución: CI prohíbe la combinación de features.cfg en structs de cuenta - Desviación del layout del IDL. Solución: Mantén el layout de la cuenta estable entre compilaciones.#[program] - Errores de compilación. Solución: Un solo módulo de programa por compilación.| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| Crate de programa de desarrollo separado | Separación clara | Flags de features en un solo crate |
| Puerta de administración en tiempo de ejecución | Mismo binario | Eliminación en tiempo de compilación |
0.32.1 en temas avanzados.
Diseños fijos grandes cuando Borsh CU es demasiado alto.
No fácilmente; planifica el crecimiento futuro.
No; documentar por separado.
JSON del IDL del llamador en tiempo de compilación.
Sí, con metadatos de cuenta correctos.
Evita diferentes IDL por feature en mainnet.
LiteSVM, Surfpool, simulación en devnet.
No; último recurso.
Ver enlaces relacionados para features.
Versiones de Stack: Esta página fue 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, y LiteSVM 0.6.x.
Revisado por Chris St. John·Última actualización: 19 jul 2026