wow-build-tools

This repository 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
.env
file - Parse a
.pkgmeta
file including support for the following fields:-
package-as
-
externals
in 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
) -
url
-
tag
-
branch
-
commit
-
type
-
curse-slug
-
path
- Backward-compatible for legacy URLs (e.g.
-
ignore
(test_e2e/test_ignores) -
plain-copy
- needs to be a pattern, and it does not get token replacement -
move-folders
-
tools-used
-
required-dependencies
-
optional-dependencies
-
embedded-libraries
-
enable-nolib-creation
-
enable-toc-creation
-
license-output
(test_e2e/test_license_exist, test_e2e/test_license_download) -
manual-changelog
-
filename
-
markup-type
(markdown
,html
,text
)
-
-
changelog-title
-
wowi-create-changelog
-
wowi-convert-changelog
-
wowi-archive-previous
-
- Handle CLI arguments:
-
-c
Skip copying files to package directory -
-d
Skip uploading/distributing -
-e
Skip fetching externals -
-l
Skip @localization@ token replacement -
-L
Only do @localization@ token replacement (skip upload to CurseForge) -
-o
Keep existing package directory, overwrite contents -
-s
Create "nolib" package -
-S
Split toc file for multiple game types -
-u
Use Unix line-endings -
-z
Skip zip file creation -
-t topdir
Specify the top directory of the repository -
-r releasedir
Specify the directory to copy files to -
-p curse-id
Specify the CurseForge project ID -
-w wowi-id
Specify the WoWInterface project ID -
-a wago-id
Specify the Wago.io project ID -
-g game-version
Specify the game version for uploading -
-m pkgmeta-file
Specify the pkgmeta file to use -
-n "{template}"
Tokenized zip file and upload label names
-
- Support multiple styles of toc files:
- Single 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.xml
files (also undocumented.md
and.txt
files 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@
-
@beta@
-
@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
- More token replacements
- 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
- Option to create a Lua version of the changelog
- 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!