Composer: Difference between revisions
adds commentary about detached head |
extract SemVer to new article |
||
| (13 intermediate revisions by 2 users not shown) | |||
| Line 1: | Line 1: | ||
Composer is one of many [[Dependency managers]]. Composer makes it easier to distribute PHP code that relies on other code. | |||
Composer | To use [https://getcomposer.org/ Composer] in your PHP project, see | ||
* this [http://daylerees.com/composer-primer primer], | |||
* plus Matthieu Moquet's "''[https://moquet.net/blog/5-features-about-composer-php/ 5 Features About Composer]''", | |||
* and also this handy-dandy [http://composer.json.jolicode.com/ cheatsheet] (with mouseovers!) | |||
== in MediaWiki == | == in MediaWiki == | ||
<ol> | <ol> | ||
<li> [[mw:Composer]] is used in the MediaWiki engine to manage all core libraries and dependencies since version 1.25 (including composer-local.json) | <li> [[mw:Composer]] is used in the MediaWiki engine to manage all core libraries and dependencies since version 1.25 (including composer-local.json) | ||
< | <syntaxhighlight lang="bash"> | ||
cd $IP | cd $IP | ||
cp composer.local.json-sample composer.local.json | cp composer.local.json-sample composer.local.json | ||
composer update --no-dev --dry-run | composer update --no-dev --dry-run | ||
</ | </syntaxhighlight> | ||
<li> [[mw:Composer/For extensions]] on using Composer to manage extensions | <li> [[mw:Composer/For extensions]] on using Composer to manage extensions | ||
<li> [[mw:Manual:composer.json best practices]] for how to add Composer support to your extensions (including extension.json and skin.json) | <li> [[mw:Manual:composer.json best practices]] for how to add Composer support to your extensions (including extension.json and skin.json) | ||
| Line 16: | Line 19: | ||
</ol> | </ol> | ||
=== | === With Meza === | ||
Say you installed Semantic Mediawiki with <code>composer require</code> and then when you went to your 'extensions' directory you were <i class="fa fa-frown-o"></i> because it wasn't a git checkout. You can rectify that by redoing the command, but with the <code>--prefer-source</code> option. nb. You first have to move the existing directory out of the way: <code>mv SemanticMediaWiki unused/</code> <code>cd ../ composer require --update-no-dev --sort-packages --optimize-autoloader -vvv mediawiki/semantic-media-wiki "~2.4" --prefer-source</code> But, it's still a bit different than you might expect, | === MezaLocalExtensions.yml === | ||
If the extension should be '''installed''' by Composer, then use a stanza like: | |||
<syntaxhighlight lang="yaml"> | |||
- name: Mermaid | |||
composer: "mediawiki/mermaid" | |||
version: ~2.2 | |||
config: | | |||
wfLoadExtension( 'Mermaid' ); | |||
$mermaidgDefaultTheme = 'neutral'; | |||
</syntaxhighlight> | |||
If the extension source is controlled by [[git]], and you want to have the extension's <tt>composer.json</tt> file "seen" (merged) by MediaWiki, then simply add the line: | |||
composer_merge: true | |||
to the 'normal' extension stanza specifying the source. | |||
=== Install libraries === | |||
In general, if you want to install something into your MediaWiki instance, you can do the following from the '$IP' (Install Path) directory: | |||
<syntaxhighlight lang="bash"> | |||
# add the library to composer.local.json | |||
COMPOSER=composer.local.json composer require --no-update mwstake/mediawiki-component-events:~4 | |||
# install it to 'vendor' without dev requirements and optimize the autoloader | |||
composer update mwstake/mediawiki-component-events --no-dev -o | |||
# check to see that it's installed | |||
composer show |grep mwstake | |||
</syntaxhighlight> | |||
=== Test an upgrade === | |||
<syntaxhighlight lang="bash"> | |||
IP=/opt/htdocs/mediawiki/ | |||
cd $IP | |||
COMPOSER=composer.local.json composer require --no-update mediawiki/maps:~11.0 | |||
composer update mediawiki/maps --no-dev -o | |||
# Depending on other settings, you may need to restart php-fpm | |||
sudo systemctl restart php-fpm | |||
</syntaxhighlight> | |||
=== Check / Overwrite Local Modifications === | |||
If you're using [[Meza]] to deploy your MediaWiki platform, you may wonder whether there are local modifications that a new deploy could overwrite. | |||
<code>composer status -v</code> will show you where you have modified any extensions installed by composer. | |||
To overwrite changes, there isn't any 'force' option to composer. In the situation where you would like to overwrite local modifications with an unattended composer (aka <code>--no-interaction</code>) then you should add to composer's configuration (composer.local.json) | |||
<syntaxhighlight lang="yaml"> | |||
"config": { | |||
"discard-changes": true | |||
}, | |||
</syntaxhighlight> | |||
This feature is now enabled in Meza 43, and controlled by the default config <tt>config/defaults.yml</tt> <code>overwrite_local_changes: false</code> which in turn sets the config section of <tt>composer.local.json</tt> | |||
=== Prefer Source === | |||
Say you installed Semantic Mediawiki with <code>composer require</code> and then when you went to your 'extensions' directory you were <i class="fa fa-frown-o"></i> because it wasn't a git checkout. You can rectify that by redoing the command, but with the <code>--prefer-source</code> option. nb. You first have to move the existing directory out of the way: <code>mv SemanticMediaWiki unused/</code> <code>cd ../ composer require --update-no-dev --sort-packages --optimize-autoloader -vvv mediawiki/semantic-media-wiki "~2.4" --prefer-source</code> But, it's still a bit different than you might expect, because Composer leaves you with a detached head owing to the specific version that it checks out (see composer.lock). | |||
<pre> | <pre> | ||
Dependency resolution completed in 0.002 seconds | Dependency resolution completed in 0.002 seconds | ||
| Line 42: | Line 98: | ||
Installing it on your own host would look something like this | Installing it on your own host would look something like this | ||
< | <syntaxhighlight lang="bash"> | ||
curl -sS https://getcomposer.org/installer | php | curl -sS https://getcomposer.org/installer | php | ||
sudo mv composer.phar /usr/local/bin/composer | sudo mv composer.phar /usr/local/bin/composer | ||
| Line 49: | Line 105: | ||
# now you can use it to do things like install the latest version of Drush | # now you can use it to do things like install the latest version of Drush | ||
composer global require drush/drush:dev-master | composer global require drush/drush:dev-master | ||
</ | </syntaxhighlight> | ||
while installing it on a shared host like WebFaction would be slightly modified | while installing it on a shared host like WebFaction would be slightly modified | ||
< | <syntaxhighlight lang="bash"> | ||
ln -s `which php54` ~/bin/php | ln -s `which php54` ~/bin/php | ||
curl -sS https://getcomposer.org/installer | php54 | curl -sS https://getcomposer.org/installer | php54 | ||
| Line 63: | Line 119: | ||
composer global require drush/drush:dev-master | composer global require drush/drush:dev-master | ||
drush --version | drush --version | ||
</ | </syntaxhighlight> | ||
== Semantic Versioning == | |||
Using Composer correctly means that you understand and follow [[Semantic Versioning]] | |||
== Commands == | == Commands == | ||
<code>composer show -a mediawiki/semantic-media-wiki</code> will show you the available versions of the package. | |||
<code>composer --help</code> will show you something like this: | |||
<pre> | <pre> | ||
______ | ______ | ||
| Line 74: | Line 136: | ||
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/ | \____/\____/_/ /_/ /_/ .___/\____/____/\___/_/ | ||
/_/ | /_/ | ||
Composer version 2.8.4 2024-12-11 11:57:47 | |||
Composer version | |||
Usage: | Usage: | ||
| Line 81: | Line 142: | ||
Options: | Options: | ||
-h, --help Display | -h, --help Display help for the given command. When no command is given display help for the list command | ||
-q, --quiet Do not output any message | -q, --quiet Do not output any message | ||
-V, --version Display this application version | -V, --version Display this application version | ||
--ansi | --ansi|--no-ansi Force (or disable --no-ansi) ANSI output | ||
-n, --no-interaction Do not ask any interactive question | -n, --no-interaction Do not ask any interactive question | ||
--profile Display timing and memory usage information | --profile Display timing and memory usage information | ||
--no-plugins Whether to disable plugins. | --no-plugins Whether to disable plugins. | ||
--no-scripts Skips the execution of all scripts defined in composer.json file. | |||
-d, --working-dir=WORKING-DIR If specified, use the given directory as working directory. | -d, --working-dir=WORKING-DIR If specified, use the given directory as working directory. | ||
--no-cache Prevent use of the cache | |||
-v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug | -v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug | ||
Available commands: | Available commands: | ||
about | about Shows a short information about Composer | ||
archive | archive Creates an archive of this composer package | ||
browse | audit Checks for security vulnerability advisories for installed packages | ||
clear-cache | browse [home] Opens the package's repository URL or homepage in your browser | ||
bump Increases the lower limit of your composer.json requirements to the currently installed versions | |||
config | check-platform-reqs Check that platform requirements are satisfied | ||
create-project | clear-cache [clearcache|cc] Clears composer's internal package cache | ||
depends | completion Dump the shell completion script | ||
diagnose | config Sets config options | ||
dump-autoload | create-project Creates new project from a package into given directory | ||
depends [why] Shows which packages cause the given package to be installed | |||
exec | diagnose Diagnoses the system to identify common errors | ||
global | dump-autoload [dumpautoload] Dumps the autoloader | ||
help | exec Executes a vendored binary/script | ||
fund Discover how to help fund the maintenance of your dependencies | |||
global Allows running commands in the global composer dir ($COMPOSER_HOME) | |||
init | help Display help for a command | ||
install | init Creates a basic composer.json file in current directory | ||
licenses | install [i] Installs the project dependencies from the composer.lock file if present, or falls back on the composer.json | ||
licenses Shows information about licenses of dependencies | |||
list | list List commands | ||
outdated | outdated Shows a list of installed packages that have updates available, including their latest version | ||
prohibits [why-not] Shows which packages prevent the given package from being installed | |||
prohibits | reinstall Uninstalls and reinstalls the given package names | ||
remove | remove [rm|uninstall] Removes a package from the require or require-dev | ||
require | require [r] Adds required packages to your composer.json and installs them | ||
run-script | run-script [run] Runs the scripts defined in composer.json | ||
search | search Searches for packages | ||
self-update | self-update [selfupdate] Updates composer.phar to the latest version | ||
show [info] Shows information about packages | |||
show | status Shows a list of locally modified packages | ||
status | suggests Shows package suggestions | ||
suggests | update [u|upgrade] Updates your dependencies to the latest version according to composer.json, and updates the composer.lock file | ||
validate Validates a composer.json and composer.lock | |||
update | </pre> | ||
validate | |||
== See Also == | |||
[[Composer/autoloading]] | |||
[[Category:Development]] | [[Category:Development]] | ||
[[Category:Tools]] | [[Category:Tools]] | ||
[[Category:PHP]] | [[Category:PHP]] | ||