wow-build-tools
![]()
This repository is aims to be a collection of tools to help with the development of World of Warcraft addons. The main focus is on speed and ease of use, with the goal of making the development process as smooth as possible.
Features
I have many plans for this project, and I will communicate those plans at a later date.
BigWigsMods/packager feature parity
To start, I'd like wow-build-tools to be as close to a drop-in replacement for BigWigsMods/packager as possible. That means, ideally, it should be able to handle all of the same features as packager with the same level of ease and speed or better:
- Support for WoW addons leveraging the following VCS (in order of priority):
- Git
- SVN
- Mercurial
- Support storing secrets in a
.envfile - Parse a
.pkgmetafile including support for the following fields:package-asexternalsin various forms:- Backward-compatible for legacy URLs (e.g.
git.curseforge.com,svn.wowace.com, etc.) - "Bare" externals (e.g.
Libs/LibStub: https://repos.wowace.com/wow/ace3/trunk/LibStub) urltagbranchcommittypecurse-slugpathignore(test_e2e/test_ignores)plain-copy- needs to be a pattern, and it does not get token replacementmove-folderstools-usedrequired-dependenciesoptional-dependenciesembedded-librariesenable-nolib-creationenable-toc-creationlicense-outputmanual-changelogfilenamemarkup-type(markdown,html,text)changelog-titlewowi-create-changelogwowi-convert-changelogwowi-archive-previous
- Handle CLI arguments:
-cSkip copying files to package directory-dSkip uploading/distributing-eSkip fetching externals-lSkip @localization@ token replacement-LOnly do @localization@ token replacement (skip upload to CurseForge)-oKeep existing package directory, overwrite contents-sCreate "nolib" package-SSplit toc file for multiple game types-uUse Unix line-endings-zSkip zip file creation-t topdirSpecify the top directory of the repository-r releasedirSpecify the directory to copy files to-p curse-idSpecify the CurseForge project ID-w wowi-idSpecify the WoWInterface project ID-a wago-idSpecify the Wago.io project ID-g game-versionSpecify the game version for uploading-m pkgmeta-fileSpecify the pkgmeta file to use-n "{template}"Tokenized zip file and upload label names
- Support multiple styles of toc files:
- Si`ngle TOC and Single Game Type/Flavor
- Single TOC and Multiple Game Types/Flavors
- Multiple TOCs per Game Type/Flavor
- Splitting a single TOC into multiple TOCs
- Download external dependencies (at least happy path)
- Git Externals (test_e2e/test_git_externals)
- SVN Externals (test_e2e/test_svn_externals)
- Mercurial Externals
- Copy non-ignored files to a "release" directory
- Handle token replacement for the following tokens in
.toc,.lua, and.xmlfiles (also undocumented.mdand.txtfiles also support token replacement):@package-name@@project-version@@project-hash@@project-abbreviated-hash@@project-author@@project-date-iso@@project-date-integer@@project-timestamp@@project-revision@@file-revision@@file-hash@@file-abbreviated-hash@@file-author@@file-date-iso@@file-date-integer@@file-timestamp@@build-date@@build-date-iso@@build-date-integer@@build-timestamp@
- Handle
@localization@token replacement - Handle build-type conditional blocks of code through tokens:
@alpha@@debug@@do-not-package@@no-lib-strip@@retail@@version-retail@@version-classic@@version-bcc@@version-wrath@@version-cata@@version-mop@- assuming the trend continues@version-wod@@version-legion@@version-bfa@@version-sl@@version-df@@version-tww@
- Move folders to a different location within the release directory
- Create a zip file of the package directory
- Create a nolib zip file of the package directory
- Handle tokenized naming for the zip file:
{package-name}{project-version}{project-hash}{project-abbreviated-hash}{project-author}{project-date-iso}{project-date-integer}{project-timestamp}{project-revision}{game-type}{release-type}{alpha}{beta}{nolib}{classic}
- Handle tokenized naming for the release label (when uploaded to CurseForge, WoWInterface, etc.)
{package-name}{project-version}{project-hash}{project-abbreviated-hash}{project-author}{project-date-iso}{project-date-integer}{project-timestamp}{project-revision}{game-type}{release-type}{alpha}{beta}{nolib}{classic}
- Generate a changelog
- Git
- SVN
- Mercurial
- Creating and Updating GitHub Releases
- Upload output assets to GitHub Releases
- Upload to CurseForge
- Upload to WoWInterface
- Upload to Wago.io
- A GitHub Action available via the GitHub Marketplace
Since WoW has been around since 2004, there are a lot of addons that have been around for a long time. The landscape of technology has changed a lot since then, so I will be prioritizing features that I believe are more widely used and more relevant to the current state of the game. If you have a use case that isn't possible yet, please open an issue and I will do my best to address it!
Additional features
In addition to feature parity with BigWigsMods/packager, I have a few ideas for additional features that I think would be useful for addon authors:
- Autoupdating the tool itself
- Guided tour of the tool
- Various warnings and checks to help catch issues with the addon before packaging
- Monorepo support
- Automatic propagation of addon changes to all installed and compatible game versions
- New Addon Scaffolding
- A badge to proudly display that your addon is built with
wow-build-tools!
Inspiration and acknowledgements
My main inspiration comes from my desire to always make developer experience as smooth as possible. I've had a few different roles across different companies and industries that have focused on developer experience, and I've always found it to be a rewarding challenge and a force multiplier for teams. What better way to give back to the WoW community than to align my passions and expertise to help make the development process easier for addon authors?
I was also heavily inspired by BigWigsMods/packager which provides (to my knowledge) the most widely used tool for packaging addons for distribution via CurseForge, WoWInterface, and Wago.io. Thank you to the authors and contributors of that project for all of their hard work and dedication!