Composer: Difference between revisions
Created page with "Composer is a dependency manager that makes it easier to distribute PHP code that relies on other code. Installing it on your own host would look something like this <so..." |
extract SemVer to new article |
||
| (26 intermediate revisions by 2 users not shown) | |||
| Line 1: | Line 1: | ||
Composer is | Composer is one of many [[Dependency managers]]. Composer makes it easier to distribute PHP code that relies on other code. | ||
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 == | |||
<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) | |||
<syntaxhighlight lang="bash"> | |||
cd $IP | |||
cp composer.local.json-sample composer.local.json | |||
composer update --no-dev --dry-run | |||
</syntaxhighlight> | |||
<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> Jeroen DeDauw wrote [https://www.entropywins.wtf/blog/2013/11/24/introduction-to-composer-for-mediawiki-developers/ this blog post in 2014] that is probably still not only relevant, but also contains wisdom not addressed in other places (e.g. Extension developers should specify <code>"type": "mediawiki-extension"</code> in their extension's composer.json so that Composer installs your package into the 'extensions' folder instead of the typical 'vendor' folder that is Composer's default.) | |||
</ol> | |||
=== With Meza === | |||
=== 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> | |||
Dependency resolution completed in 0.002 seconds | |||
- Installing mediawiki/semantic-media-wiki (2.4.3) | |||
Executing command (CWD): git --version | |||
Cloning 6661acdd8c8420a7e07c178aad47590d086c83d6 | |||
Executing command (CWD): git clone --no-checkout 'https://github.com/SemanticMediaWiki/SemanticMediaWiki.git' 'extensions/SemanticMediaWiki/' && cd 'extensions/SemanticMediaWiki/' && git remote add composer 'https://github.com/SemanticMediaWiki/SemanticMediaWiki.git' && git fetch composer | |||
Executing command (extensions/SemanticMediaWiki/): git remote set-url --push origin 'git@github.com:SemanticMediaWiki/SemanticMediaWiki.git' | |||
Executing command (extensions/SemanticMediaWiki/): git branch -r | |||
Executing command (extensions/SemanticMediaWiki/): git checkout '2.4.3' -- | |||
Executing command (extensions/SemanticMediaWiki/): git reset --hard '6661acdd8c8420a7e07c178aad47590d086c83d6' -- | |||
REASON: Required by the root package: Install command rule (install mediawiki/semantic-media-wiki 2.4.3|install mediawiki/semantic-media-wiki 2.4.0|install mediawiki/semantic-media-wiki 2.4.1|install mediawiki/semantic-media-wiki 2.4.2|install mediawiki/semantic-media-wiki 2.4.3) | |||
$ git branch | |||
* (detached from 2.4.3) | |||
master | |||
$ git status | |||
HEAD detached at 2.4.3 | |||
nothing to commit, working directory clean | |||
</pre> | |||
== Installation == | |||
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 10: | 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 24: | 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 == | |||
<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> | |||
______ | |||
/ ____/___ ____ ___ ____ ____ ________ _____ | |||
/ / / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/ | |||
/ /___/ /_/ / / / / / / /_/ / /_/ (__ ) __/ / | |||
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/ | |||
/_/ | |||
Composer version 2.8.4 2024-12-11 11:57:47 | |||
Usage: | |||
command [options] [arguments] | |||
Options: | |||
-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 | |||
-V, --version Display this application version | |||
--ansi|--no-ansi Force (or disable --no-ansi) ANSI output | |||
-n, --no-interaction Do not ask any interactive question | |||
--profile Display timing and memory usage information | |||
--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. | |||
--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 | |||
Available commands: | |||
about Shows a short information about Composer | |||
archive Creates an archive of this composer package | |||
audit Checks for security vulnerability advisories for installed packages | |||
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 | |||
check-platform-reqs Check that platform requirements are satisfied | |||
clear-cache [clearcache|cc] Clears composer's internal package cache | |||
completion Dump the shell completion script | |||
config Sets config options | |||
create-project Creates new project from a package into given directory | |||
depends [why] Shows which packages cause the given package to be installed | |||
diagnose Diagnoses the system to identify common errors | |||
dump-autoload [dumpautoload] Dumps the autoloader | |||
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) | |||
help Display help for a command | |||
init Creates a basic composer.json file in current directory | |||
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 commands | |||
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 | |||
reinstall Uninstalls and reinstalls the given package names | |||
remove [rm|uninstall] Removes a package from the require or require-dev | |||
require [r] Adds required packages to your composer.json and installs them | |||
run-script [run] Runs the scripts defined in composer.json | |||
search Searches for packages | |||
self-update [selfupdate] Updates composer.phar to the latest version | |||
show [info] Shows information about packages | |||
status Shows a list of locally modified packages | |||
suggests Shows package suggestions | |||
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 | |||
</pre> | |||
== See Also == | |||
[[Composer/autoloading]] | |||
[[Category:Development]] | |||
[[Category:Tools]] | |||
[[Category:PHP]] | |||