The apache-superset-extensions-cli package provides command-line tools for creating, developing, and packaging Apache Superset extensions. It streamlines the entire extension development workflow from initialization to deployment.
Install the CLI globally using pip:
pip install apache-superset-extensions-cli
Or install locally in your project:
pip install --user apache-superset-extensions-cli
Verify installation:
superset-extensions --version # Output: apache-superset-extensions-cli version 1.0.0
| Command | Description |
|---|---|
init | Create a new extension project |
dev | Start development mode with hot reload |
build | Build extension assets for production |
bundle | Package extension into a .supx file |
validate | Validate extension metadata and structure |
publish | Publish extension to registry (future) |
Creates a new extension project with the standard structure and boilerplate code.
superset-extensions init [options] <extension-name>
--type, -t <type> - Extension type: full (default), frontend-only, backend-only--template <template> - Project template: default, sql-lab, dashboard, chart--author <name> - Extension author name--description <desc> - Extension description--license <license> - License identifier (default: Apache-2.0)--superset-version <version> - Minimum Superset version (default: 4.0.0)--skip-install - Skip installing dependencies--use-typescript - Use TypeScript for frontend (default: true)--use-npm - Use npm instead of yarn# Create a basic extension superset-extensions init my-extension # Create a SQL Lab focused extension superset-extensions init query-optimizer --template sql-lab # Create frontend-only extension superset-extensions init custom-viz --type frontend-only # Create with metadata superset-extensions init data-quality \ --author "Jane Doe" \ --description "Data quality monitoring for SQL Lab"
my-extension/ ├── extension.json # Extension metadata ├── frontend/ # Frontend source code │ ├── src/ │ │ ├── index.tsx # Main entry point │ │ └── components/ # React components │ ├── package.json │ ├── tsconfig.json │ └── webpack.config.js ├── backend/ # Backend source code │ ├── src/ │ │ └── my_extension/ │ │ ├── __init__.py │ │ └── api.py │ ├── tests/ │ └── requirements.txt ├── README.md └── .gitignore
Starts development mode with automatic rebuilding and hot reload.
superset-extensions dev [options]
--port, -p <port> - Development server port (default: 9001)--host <host> - Development server host (default: localhost)--watch-backend - Also watch backend files (default: true)--watch-frontend - Also watch frontend files (default: true)--no-open - Don't open browser automatically--superset-url <url> - Superset instance URL (default: http://localhost:8088)--verbose - Enable verbose logging# Start development mode superset-extensions dev # Use custom port superset-extensions dev --port 9002 # Connect to remote Superset superset-extensions dev --superset-url https://superset.example.com
superset-extensions dev
superset_config.py):LOCAL_EXTENSIONS = [ "/path/to/your/extension" ] ENABLE_EXTENSIONS = True
superset run -p 8088 --with-threads --reload
The extension will automatically reload when you make changes.
Builds extension assets for production deployment.
superset-extensions build [options]
--mode <mode> - Build mode: production (default), development--analyze - Generate bundle analysis report--source-maps - Generate source maps--minify - Minify output (default: true in production)--output, -o <dir> - Output directory (default: dist)--clean - Clean output directory before build--parallel - Build frontend and backend in parallel# Production build superset-extensions build # Development build with source maps superset-extensions build --mode development --source-maps # Analyze bundle size superset-extensions build --analyze # Custom output directory superset-extensions build --output build
dist/
├── manifest.json # Build manifest
├── frontend/
│ ├── remoteEntry.[hash].js
│ ├── [name].[hash].js
│ └── assets/
└── backend/
└── my_extension/
├── __init__.py
└── *.py
Packages the built extension into a distributable .supx file.
superset-extensions bundle [options]
--output, -o <file> - Output filename (default: {name}-{version}.supx)--sign - Sign the bundle (requires configured keys)--compression <level> - Compression level 0-9 (default: 6)--exclude <patterns> - Files to exclude (comma-separated)--include-dev-deps - Include development dependencies# Create bundle superset-extensions bundle # Custom output name superset-extensions bundle --output my-extension-latest.supx # Signed bundle superset-extensions bundle --sign # Exclude test files superset-extensions bundle --exclude "**/*.test.js,**/*.spec.ts"
The .supx file is a ZIP archive containing:
my-extension-1.0.0.supx
├── manifest.json
├── extension.json
├── frontend/
│ └── dist/
└── backend/
└── src/
Validates extension structure, metadata, and compatibility.
superset-extensions validate [options]
--strict - Enable strict validation--fix - Auto-fix correctable issues--check-deps - Validate dependencies--check-security - Run security checks# Basic validation superset-extensions validate # Strict mode with auto-fix superset-extensions validate --strict --fix # Full validation superset-extensions validate --check-deps --check-security
Create .superset-extension.json for project-specific settings:
{ "build": { "mode": "production", "sourceMaps": true, "analyze": false, "parallel": true }, "dev": { "port": 9001, "host": "localhost", "autoOpen": true }, "bundle": { "compression": 6, "sign": false, "exclude": [ "**/*.test.*", "**/*.spec.*", "**/tests/**" ] }, "validation": { "strict": true, "autoFix": true } }
Configure CLI behavior using environment variables:
# Superset connection export SUPERSET_URL=http://localhost:8088 export SUPERSET_USERNAME=admin export SUPERSET_PASSWORD=admin # Development settings export EXTENSION_DEV_PORT=9001 export EXTENSION_DEV_HOST=localhost # Build settings export EXTENSION_BUILD_MODE=production export EXTENSION_SOURCE_MAPS=true # Registry settings (future) export EXTENSION_REGISTRY_URL=https://registry.superset.apache.org export EXTENSION_REGISTRY_TOKEN=your-token
Create custom project templates:
# Use custom template superset-extensions init my-ext --template https://github.com/user/template # Use local template superset-extensions init my-ext --template ./my-template
name: Build Extension on: [push, pull_request] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Setup Python uses: actions/setup-python@v2 with: python-version: '3.9' - name: Setup Node uses: actions/setup-node@v2 with: node-version: '16' - name: Install CLI run: pip install apache-superset-extensions-cli - name: Install dependencies run: | npm install --prefix frontend pip install -r backend/requirements.txt - name: Validate run: superset-extensions validate --strict - name: Build run: superset-extensions build --mode production - name: Bundle run: superset-extensions bundle - name: Upload artifact uses: actions/upload-artifact@v2 with: name: extension-bundle path: '*.supx'
Deploy extensions automatically:
#!/bin/bash # deploy.sh # Build and bundle superset-extensions build --mode production superset-extensions bundle --sign # Upload to Superset instance BUNDLE=$(ls *.supx | head -1) curl -X POST "$SUPERSET_URL/api/v1/extensions/import/" \ -H "Authorization: Bearer $SUPERSET_TOKEN" \ -F "bundle=@$BUNDLE" # Verify deployment curl "$SUPERSET_URL/api/v1/extensions/" \ -H "Authorization: Bearer $SUPERSET_TOKEN"
Manage multiple extensions in one repository:
# Initialize multiple extensions superset-extensions init extensions/viz-plugin --type frontend-only superset-extensions init extensions/sql-optimizer --template sql-lab superset-extensions init extensions/auth-provider --type backend-only # Build all extensions for dir in extensions/*/; do (cd "$dir" && superset-extensions build) done # Bundle all extensions for dir in extensions/*/; do (cd "$dir" && superset-extensions bundle) done
# Error: Port 9001 is already in use # Solution: Use a different port superset-extensions dev --port 9002
# Error: Cannot find module '@apache-superset/core' # Solution: Ensure dependencies are installed npm install --prefix frontend
# Check Node and Python versions node --version # Should be 16+ python --version # Should be 3.9+ # Clear cache and rebuild rm -rf dist node_modules frontend/node_modules npm install --prefix frontend superset-extensions build --clean
# Warning: Bundle size exceeds recommended limit # Solution: Analyze and optimize superset-extensions build --analyze # Exclude unnecessary files superset-extensions bundle --exclude "**/*.map,**/*.test.*"
Enable debug logging:
# Set debug environment variable export DEBUG=superset-extensions:* # Or use verbose flag superset-extensions dev --verbose superset-extensions build --verbose
# General help superset-extensions --help # Command-specific help superset-extensions init --help superset-extensions dev --help # Version information superset-extensions --version