mirror of
https://github.com/apache/superset.git
synced 2026-04-09 03:16:07 +00:00
579 lines
13 KiB
Markdown
579 lines
13 KiB
Markdown
---
|
|
title: Extension CLI
|
|
sidebar_position: 1
|
|
---
|
|
|
|
<!--
|
|
Licensed to the Apache Software Foundation (ASF) under one
|
|
or more contributor license agreements. See the NOTICE file
|
|
distributed with this work for additional information
|
|
regarding copyright ownership. The ASF licenses this file
|
|
to you under the Apache License, Version 2.0 (the
|
|
"License"); you may not use this file except in compliance
|
|
with the License. You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing,
|
|
software distributed under the License is distributed on an
|
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
KIND, either express or implied. See the License for the
|
|
specific language governing permissions and limitations
|
|
under the License.
|
|
-->
|
|
|
|
# Superset Extension CLI
|
|
|
|
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.
|
|
|
|
## Installation
|
|
|
|
Install the CLI globally using pip:
|
|
|
|
```bash
|
|
pip install apache-superset-extensions-cli
|
|
```
|
|
|
|
Or install locally in your project:
|
|
|
|
```bash
|
|
pip install --user apache-superset-extensions-cli
|
|
```
|
|
|
|
Verify installation:
|
|
|
|
```bash
|
|
superset-extensions --version
|
|
# Output: apache-superset-extensions-cli version 1.0.0
|
|
```
|
|
|
|
## Commands Overview
|
|
|
|
| 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) |
|
|
|
|
## Command Reference
|
|
|
|
### init
|
|
|
|
Creates a new extension project with the standard structure and boilerplate code.
|
|
|
|
```bash
|
|
superset-extensions init [options] <extension-name>
|
|
```
|
|
|
|
#### Options
|
|
|
|
- `--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
|
|
|
|
#### Examples
|
|
|
|
```bash
|
|
# 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"
|
|
```
|
|
|
|
#### Generated Structure
|
|
|
|
```
|
|
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
|
|
```
|
|
|
|
### dev
|
|
|
|
Starts development mode with automatic rebuilding and hot reload.
|
|
|
|
```bash
|
|
superset-extensions dev [options]
|
|
```
|
|
|
|
#### 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
|
|
|
|
#### Examples
|
|
|
|
```bash
|
|
# 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
|
|
```
|
|
|
|
#### Development Workflow
|
|
|
|
1. **Start the dev server:**
|
|
```bash
|
|
superset-extensions dev
|
|
```
|
|
|
|
2. **Configure Superset** (`superset_config.py`):
|
|
```python
|
|
LOCAL_EXTENSIONS = [
|
|
"/path/to/your/extension"
|
|
]
|
|
ENABLE_EXTENSIONS = True
|
|
```
|
|
|
|
3. **Start Superset:**
|
|
```bash
|
|
superset run -p 8088 --with-threads --reload
|
|
```
|
|
|
|
The extension will automatically reload when you make changes.
|
|
|
|
### build
|
|
|
|
Builds extension assets for production deployment.
|
|
|
|
```bash
|
|
superset-extensions build [options]
|
|
```
|
|
|
|
#### 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
|
|
|
|
#### Examples
|
|
|
|
```bash
|
|
# 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
|
|
```
|
|
|
|
#### Build Output
|
|
|
|
```
|
|
dist/
|
|
├── manifest.json # Build manifest
|
|
├── frontend/
|
|
│ ├── remoteEntry.[hash].js
|
|
│ ├── [name].[hash].js
|
|
│ └── assets/
|
|
└── backend/
|
|
└── my_extension/
|
|
├── __init__.py
|
|
└── *.py
|
|
```
|
|
|
|
### bundle
|
|
|
|
Packages the built extension into a distributable `.supx` file.
|
|
|
|
```bash
|
|
superset-extensions bundle [options]
|
|
```
|
|
|
|
#### 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
|
|
|
|
#### Examples
|
|
|
|
```bash
|
|
# 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"
|
|
```
|
|
|
|
#### Bundle Structure
|
|
|
|
The `.supx` file is a ZIP archive containing:
|
|
|
|
```
|
|
my-extension-1.0.0.supx
|
|
├── manifest.json
|
|
├── extension.json
|
|
├── frontend/
|
|
│ └── dist/
|
|
└── backend/
|
|
└── src/
|
|
```
|
|
|
|
### validate
|
|
|
|
Validates extension structure, metadata, and compatibility.
|
|
|
|
```bash
|
|
superset-extensions validate [options]
|
|
```
|
|
|
|
#### Options
|
|
|
|
- `--strict` - Enable strict validation
|
|
- `--fix` - Auto-fix correctable issues
|
|
- `--check-deps` - Validate dependencies
|
|
- `--check-security` - Run security checks
|
|
|
|
#### Examples
|
|
|
|
```bash
|
|
# Basic validation
|
|
superset-extensions validate
|
|
|
|
# Strict mode with auto-fix
|
|
superset-extensions validate --strict --fix
|
|
|
|
# Full validation
|
|
superset-extensions validate --check-deps --check-security
|
|
```
|
|
|
|
#### Validation Checks
|
|
|
|
- Extension metadata completeness
|
|
- File structure conformity
|
|
- API version compatibility
|
|
- Dependency security vulnerabilities
|
|
- Code quality standards
|
|
- Bundle size limits
|
|
|
|
## Configuration File
|
|
|
|
Create `.superset-extension.json` for project-specific settings:
|
|
|
|
```json
|
|
{
|
|
"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
|
|
}
|
|
}
|
|
```
|
|
|
|
## Environment Variables
|
|
|
|
Configure CLI behavior using environment variables:
|
|
|
|
```bash
|
|
# 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
|
|
```
|
|
|
|
## Advanced Usage
|
|
|
|
### Custom Templates
|
|
|
|
Create custom project templates:
|
|
|
|
```bash
|
|
# 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
|
|
```
|
|
|
|
### CI/CD Integration
|
|
|
|
#### GitHub Actions
|
|
|
|
```yaml
|
|
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'
|
|
```
|
|
|
|
### Automated Deployment
|
|
|
|
Deploy extensions automatically:
|
|
|
|
```bash
|
|
#!/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"
|
|
```
|
|
|
|
### Multi-Extension Projects
|
|
|
|
Manage multiple extensions in one repository:
|
|
|
|
```bash
|
|
# 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
|
|
```
|
|
|
|
## Troubleshooting
|
|
|
|
### Common Issues
|
|
|
|
#### Port already in use
|
|
|
|
```bash
|
|
# Error: Port 9001 is already in use
|
|
|
|
# Solution: Use a different port
|
|
superset-extensions dev --port 9002
|
|
```
|
|
|
|
#### Module not found
|
|
|
|
```bash
|
|
# Error: Cannot find module '@apache-superset/core'
|
|
|
|
# Solution: Ensure dependencies are installed
|
|
npm install --prefix frontend
|
|
```
|
|
|
|
#### Build failures
|
|
|
|
```bash
|
|
# 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
|
|
```
|
|
|
|
#### Bundle too large
|
|
|
|
```bash
|
|
# Warning: Bundle size exceeds recommended limit
|
|
|
|
# Solution: Analyze and optimize
|
|
superset-extensions build --analyze
|
|
|
|
# Exclude unnecessary files
|
|
superset-extensions bundle --exclude "**/*.map,**/*.test.*"
|
|
```
|
|
|
|
### Debug Mode
|
|
|
|
Enable debug logging:
|
|
|
|
```bash
|
|
# Set debug environment variable
|
|
export DEBUG=superset-extensions:*
|
|
|
|
# Or use verbose flag
|
|
superset-extensions dev --verbose
|
|
superset-extensions build --verbose
|
|
```
|
|
|
|
### Getting Help
|
|
|
|
```bash
|
|
# General help
|
|
superset-extensions --help
|
|
|
|
# Command-specific help
|
|
superset-extensions init --help
|
|
superset-extensions dev --help
|
|
|
|
# Version information
|
|
superset-extensions --version
|
|
```
|
|
|
|
## Best Practices
|
|
|
|
### Development
|
|
|
|
1. **Use TypeScript** for type safety
|
|
2. **Follow the style guide** for consistency
|
|
3. **Write tests** for critical functionality
|
|
4. **Document your code** with JSDoc/docstrings
|
|
5. **Use development mode** for rapid iteration
|
|
|
|
### Building
|
|
|
|
1. **Optimize bundle size** - analyze and tree-shake
|
|
2. **Generate source maps** for debugging
|
|
3. **Validate before building** to catch issues early
|
|
4. **Use production mode** for final builds
|
|
5. **Clean build directory** to avoid stale files
|
|
|
|
### Deployment
|
|
|
|
1. **Sign your bundles** for security
|
|
2. **Version properly** using semantic versioning
|
|
3. **Test in staging** before production deployment
|
|
4. **Document breaking changes** in CHANGELOG
|
|
5. **Provide migration guides** for major updates
|
|
|
|
## Resources
|
|
|
|
- [Extension Architecture](/developer_portal/architecture/overview)
|
|
- [API Reference](/developer_portal/api/frontend)
|
|
- [Frontend Contribution Types](/developer_portal/extensions/frontend-contribution-types)
|
|
- [GitHub Repository](https://github.com/apache/superset)
|
|
- [Community Forum](https://github.com/apache/superset/discussions)
|