Over the past few years, the FoF Extension Generator has been an invaluable tool for getting started with extension development. Not needing to worry about the skeleton/structure makes diving into development much easier!
One of our core values is 'Framework First': Flarum is as much a framework for extension development as it is a forum platform. In accordance with that, we've made some changes recently:
- We released a frontend typings package:
npm install --save-dev flarum@0.1.0-beta.16
- We released a backend testing package
- We developed an extension dependency system that also includes optional dependencies (boot after X if X is installed)
- We made several large overhauls and expansions to our docs, including reorganization, addition of undocumented topics, and translation into other languages. We're planning an
examples section, which will walk you through a step-by-step tutorial of developing some basic, representative extensions.
Today I'm pleased to announce the newest addition to this family: the Flarum development CLI. Currently it is in alpha,
as we've been focused on developing a breadth of representative functionality. So far, we've implemented several such commands, designed to show aspects of what it could eventually do:
flarum-cli init: generates a blank extension skeleton, including all recommended infrastructure
flarum-cli infra backend-testing: Adds (or updates) infrastructure for running automated backend tests
flarum-cli update js-imports: Adds admin/forum/common namespaces to all JS imports from flarum core
flarum-cli generate migration: Generates a blank migration file with proper naming in the correct location
flarum-cli generate backend event-listener: Generates a blank event listener, adds an accompanying Extend\Event extender listen call to extend.php
Frequently when developing extensions, we find ourselves copying boilerplate files from other extensions / the documentation, and doing certain repetetive, menial tasks. So let's automate it away! Here's a roadmap for what we hope this tool will look like:
Command Roadmap
Init
These will generate a starter extension skeleton.
Generate
These will generate a stub file, which will initially have comments pointing to relevant places in the documentation. When applicable, an extender will also be added to extend.php.
Frontend components:
Backend components:
Testing
Other:
Update
These will perform some menial task related to updating Flarum extensions for a new version of Flarum.
Infra
As we add new things, extension skeletons get outdated. Updating them can be a pain. These will update infrastructure files / setup, copying straight from the init boilerplate to get you the latest version of whatever infrastructure component you're hoping to update.
Internal Improvements:
Things to decide
- Could this support tools, extenders, and events exported by extensions? Theoretically speaking, if it's installed in
vendor (as it should be if using dependencies / optional dependencies properly), we might be able to discover it...
- Audit: inspect stuff that's out of date? Could have separate commands for audit and for deprecated things...
- How should we group the generate commands? Should there be separate commands for each component, or something like
flarum-cli generate frontend, which would lead to an interactive menu? Or flarum-cli generate frontend component, flarum-cli generate backend api-controller, etc?
- How opinionated should this be when generating stubs? I'd argue that if no path is provided, we should place things in the recommended location (listeners and subscribers in
src\Listener). If a path is provided, place it there (TODO).
- Should we shorten the name? e.g.
fl instead of flarum-cli?
Next Steps
If you'd like to try this out, install it via npm install -g flarum-cli. You can run it with flarum-cli.
If you're interested in contributing, please comment so below! Source code is at https://github.com/flarum/flarum-cli.
At this point, the most valuable thing is feedback: did we miss anything above? Are there any menial processes you deal with when developing extensions that you would like to see automated away?