Adding New Project Types¶
Adding and maintaining project types (like typo3
, magento2
, etc.) is not too hard. Please update and add to this doc when you find things that have been missed.
To add a new project type:
- Add the new type to the list in
nodeps.go
- Add to
appTypeMatrix
inapptypes.go
- Create a new go file for your project type, like
django.go
. - Implement the functions that you think are needed for your project type and add references to them in your
appTypeMatrix
stanza. There are lots of examples that you can start with in places likedrupal.go
andtypo3.go
,shopware6.go
, etc. The comments in the code inapptypes.go
for theappTypeFuncs
for each type of action tell what these are for, but here’s a quick summary.settingsCreator
is the function that will create a main settings file if none exists.uploadDir
returns the filepath of the user-uploaded files directory for the project type, likesites/default/files
for Drupal orpub/media
for magento2.hookDefaultComments
adds comments to config.yaml about hooks with an example for that project type. It’s probably not useful at all.apptypeSettingsPaths
returns the paths for the main settings file and the extra settings file that DDEV may create (like settings.ddev.php for Drupal).appTypeDetect
is a function that determines whether the project is of the type you’re implementing.postImportDBAction
can do something after db import. I don’t see it implemented anywhere.configOverrideAction
can change default config for your project type. For example, magento2 now requiresphp8.1
, so aconfigOverrideAction
can change the php version.postConfigAction
gives a chance to do something at the end of config, but it doesn’t seem to be used anywhere.postStartAction
adds actions at the end ofddev start
. You’ll see several implementations of this, for things like creating needed default directories, or setting permissions on files, etc.importFilesAction
defines howddev import-files
works for this project type.defaultWorkingDirMap
allows the project type to override the project’sworking_dir
(whereddev ssh
andddev exec
start by default). This is mostly not done anymore, as theworking_dir
is typically the project root.composerCreateAllowedPaths
specifies the paths that can exist in a directory whenddev composer create
is being used.
- You’ll likely need templates for settings files, use the Drupal or TYPO3 templates as examples, for example
pkg/ddevapp/drupal
andpkg/ddevapp/typo3
. Those templates have to be loaded at runtime as well. - Once your project type starts working and behaving as you’d like, you’ll need to add test artifacts for it and try testing it (locally first).
- Add your project to
TestSites
inddevapp_test.go
. - Create a DDEV project named
testpkg<projectype>
somewhere and get it going and working with a database and files you can export. - Export the database, files, and (optionally) code to tarballs or
.sql.gz
. Put them somewhere on the internet—they’ll end up inddev/ddev_test_tarballs
. I can give you permissions on that if you like. Themagento2
project has descriptions explaining how each tarball gets created. Do that for yours as well. - Run the test and get it working. I usually use the trick of setting
GOTEST_SHORT=<element_in_TestSites>
, likeGOTEST_SHORT=7
. Then set that environment variable in the GoLand profile or your environment.export GOTEST_SHORT=7 && make testpkg TEST_ARGS="-run TestDdevFullsiteSetup"
- Add your project to