- Create a folder (e.g.
public
) - Move folders and files into
public
- fileadmin
- uploads
- typo3conf
- typo3temp
- index.php
- typo3 (and symlink typo3_src)
- Leave sources outside of document root and link
typo3_src
to it
- Create a sitepackage extension
- Move templates for pages and content elements into it
- Move assets into it (alternatively in a separate folder inside doc root)
- Move TypoScript from fileadmin and DB into it
- Use the
ext_typoscript_*
files in extension root to load TypoScript every time as it's needed for a site
⚠️ Be careful when using version constraints. Some extensions do not use semantic versions
- Go through every extension and separate them into
- Third-Party extensions (loaded via TER)
- Project extensions (only for this project)
- Create a folder
extensions
on project root (not inside doc root) - Move project extensions into that folder
- For every project extension do
- Add a basic composer.json with the fields
name
,type
(typo3-cms-extension
),require
,extra
andautoload
to every project extension. Example:{ "name": "vendor/extension-name", "type": "typo3-cms-extension", "require": { "typo3/cms": "^7.6 || ^8.7 || ^9.5 || ^10.4" }, "autoload": { "psr-4": { "Vendor\\ExtensionName\\": "Classes" } }, "extra": { "typo3/cms": { "extension-key": "extension_key" } } }
- The
require
section should handle all versions you need to deal with during the upgrade - Adjust the
ext_emconf.php
file - Remove upper border for TYPO3 dependencies and related extensions
- Remove files and folders created from ExtensionBuilder as they are not needed (
Configuration/ExtensionBuilder.json
,Documentation
)- Documentation folder is only needed if it's touched and filled with important information
- Move
ext_icon.(gif|png|svg)
toResources/Public/Icons/ExtensionIcon.$1
- Add a basic composer.json with the fields
- Create a composer.json file on project root
- Add TYPO3 core via composer (<= v7
typo3/cms
, > v7typo3/cms-*
), use composer helper: https://get.typo3.org/misc/composer/helper - Add every project extension with version
@dev
, e.g.composer require vendor/extension:@dev
- For every third party extension do
- Look for extension key and version
- Look if composer package exists (
https://extensions.typo3.org/extension/<extension_key>
)- Remove extension folder
- If yes,
composer require <package-name>:<version-constraint>
(for e.g. news in version 5.3.8 use version-constraint^5.3
- If not
- add composer.typo3.org as repository, see https://get.typo3.org/misc/composer/repository
composer require typo3-ter/<extension-key-with-dashes-instead-underscore:<version-constraint>
- If there are hard coded changes inside the extension, use the composer-patches package: https://packagist.org/packages/cweagans/composer-patches
- Install TYPO3 console extension (https://packagist.org/packages/helhum/typo3-console) to extend the CLI possibilities
- Use the composer helper (https://get.typo3.org/misc/composer/helper) to create a command with all the system extensions you need
- Look for all third party extension to get the version working with TYPO3 v8
composer remove typo3/cms
- Add the command from step 1 and attach all third party extension's package name and version constraint
- Run it and watch composer dependency warnings
- Adjust the versions and packages
- Use the composer helper (https://get.typo3.org/misc/composer/helper) to create a command with all the system extensions you need
- Look for all third party extension to get the version working with the target TYPO3 versions
- Add the command from step 1 and attach all third party extension's package name and version constraint
- Run it and watch composer dependency warnings
- Adjust the versions and packages
☑️ These steps can be done after every composer changes and during deployment
- Run database Compare
vendor/bin/typo3cms database:updateschema
- Run the upgrade wizards
vendor/bin/typo3cms upgrade:all
- Generate PackageStates.php file
vendor/bin/typo3cms install:generatepackagestates
- Check for DB updates or folder creations with
vendor/bin/typo3cms install:extensionsetupifpossible
Don't forget to add the previously created
extensions
folder as a local repo, so that composer will know where to look for your unpublished project extensions: