How to instal modules with Drupal 8 and Composer? - drupal

I installed Drupal 8 via composer with:
composer create-project drupal-composer/drupal-project:8.x-dev my_site --stability dev --no-interaction
This downloaded all the files and run composer install. According to this tutorial - https://www.drupal.org/node/2718229 - doing so this way will also configure composer.json to allow installation of modules, themes etc too via composer. Nice
However, I'm trying to install a new module:
$ composer require drupal/codesnippet
Using version ^1.6 for drupal/codesnippet
./composer.json has been updated
> DrupalProject\composer\ScriptHandler::checkComposerVersion
Loading composer repositories with package information
Updating dependencies (including require-dev)
- Installing drupal/codesnippet (1.6.0)
Downloading: 100%
Writing lock file
Generating autoload files
> DrupalProject\composer\ScriptHandler::createRequiredFiles
However, when I go to Admin Bar > Extend > Install new module, I can search for the module and it says it's not installed yet. If I try to enable/install it from there it tells me I need to download and copy to the /libraries directory:
Before you can use the CKEditor CodeSnippet module, you need to download the codesnippet plugin from ckeditor.com and place it in /libraries/codesnippet. Check the README.txt for more information. Get the plugin here. (Currently using CodeSnippet version Plugin not detected)
Are these two completely different methods? How can I complete the installation with composer of this module?

Composer is a dependency manager, and whether or not third-party dependencies are included depends on how the module author managed their dependencies in the first place.
You aren't going to be able to complete the install via Composer alone, if a specific dependency isn't present on the repository that Composer downloads its packages from.
You're going to have to download the CKEditor CodeSnippet module from ckeditor.com. Composer can't manage that dependency for you, because that CKEditor plugin isn't a Composer package.
You can download it here: http://ckeditor.com/addon/codesnippet

Martyn, I guess you are confusing two different things into the same one: the drupal module and the external library required by the module.
The Drupal module codesnippet (https://www.drupal.org/project/codesnippet) is just a drupal integration module for the CKeditor addon with the same name, which you can download it (http://download.ckeditor.com/codesnippet/releases/codesnippet_4.6.2.zip) and place it in the drupal webroot /libraries folder manually (in your case my_site/web/libraries/ to be more specific - you have to create it if does not exist already).
Then you should be able to enable the drupal module.
PS: You could also add the library requirement in the composer.json library manually, which might be just a bit more complicated for beginners, because you also have to manually specify other things like a repository type, url and installer-paths for the extra external library that you need , but might be easier in the long run to deploy new Drupal8 installations with the same requirements just with a proper main composer.json file, without the need to go and manually download external libraries. There is a similar comment of mine(user zet) that you could read on this drupal dropzonejs module issue https://www.drupal.org/node/2853274

Related

How to install patched modules in fresh Drupal 10 Installation?

I have a fresh Drupal 10 Installation und would like to install some modules with more ore less simple patches. I tried it in different ways and get allways the same errors with composer require.
This are my steps:
manual changed files for exampe in superfish for this patch:
https://www.drupal.org/files/issues/2022-08-01/superfish-%233.patch and manually put the module in module/contrib folder. Than I tried composer require drupal/superfish:~1.4 with different versions and with and without parameter -W.
I wrote patch in composer.json and tried composer install. There comes the message nothing to install or update. I used also composer update --lock
I downloaded last dev-Version and patch and tried with git apply.
The result with composer require is more ore less the same error like this:
Problem 1 - drupal/block_content_permissions[1.0.0, ..., 1.8.0]
require drupal/core ^8 -> found drupal/core[8.0.0, ..., 8.9.20] but
these were not loaded, likely because it conflicts with another
require. - drupal/block_content_permissions[1.9.0, ..., 1.10.0]
require drupal/core ^8 || ^9 -> found drupal/core[8.0.0, ..., 8.9.20,
9.0.0, ..., 9.5.0] but these were not loaded, likely because it conflicts with another require. - Root composer.json requires
drupal/block_content_permissions * -> satisfiable by
drupal/block_content_permissions[1.0.0, ..., 1.10.0].
You can also try re-running composer require with an explicit version
constraint, e.g. "composer require drupal/block_content_permissions:*"
to figure out if any version is installable, or "composer require
drupal/block_content_permissions:^2.1" if you know which you need.
If I enable the patched modules manualy in backend, they work normaly. But they are not under composer controll.
How to do in the right way?
Drupal.org has a documented process for allowing a lenient composer install.
For Drupal 10:
Try the Lenient Composer Plugin
The lenient composer plugin lets you specify an allowlist of packages
where you are willing to break the version constraint, using a command
like:
composer config --merge --json extra.drupal-lenient.allowed-list '["drupal/token"]'
Together with the Composer Patches Plugin, this allows you to install
any Drupal extension, even if the version constraint hasn't been
officially updated yet. Of course the code may still need to be
patched for deprecations.

Cant Install Commerce Checkout Module

I'm in the process of upgrading my website from Drupal 7 to 8 and one of my tasks is to ensure that all modules are copied over and installed.
I've been able to install every 'Commerce' module apart from the checkout.
Unable to install Commerce Checkout due to unmet dependencies:
core.entity_view_display.commerce_product_variation.default.summary
(commerce_product.commerce_product_variation_type.default)
This question was asked and answered here: Can't install drupal 8 commerce checkout module
However, it does not help me because I've already used Composer to install the commerce module but I still cant enable it.
$ composer require drupal/commerce
Using version ^2.5 for drupal/commerce
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Nothing to install or update
Generating autoload files
> Drupal\Core\Composer\Composer::preAutoloadDump
> Drupal\Core\Composer\Composer::ensureHtaccess
$ composer require drupal/commerce_checkout
Using version ^2.5 for drupal/commerce_checkout
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Nothing to install or update
Generating autoload files
> Drupal\Core\Composer\Composer::preAutoloadDump
> Drupal\Core\Composer\Composer::ensureHtaccess
$ composer require drupal/commerce_product
Using version ^2.5 for drupal/commerce_product
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Nothing to install or update
Writing lock file
Generating autoload files
> Drupal\Core\Composer\Composer::preAutoloadDump
> Drupal\Core\Composer\Composer::ensureHtaccess
I appreciate any solutions that you may have and look forward to discussing this issue with you further.
Thanks!
I guess you already fixed the issue yourself simply by "installing" drupal/commerce first.
The three snippets you provided at the end of your question look fine and actually just says they are already "installed". Composer downloaded everything for you and now you just have to enable them via drush or from the UI.
Now I got it. This error message occurs when installing Commerce Checkout via drush/drupal console (or maybe even via the UI). And it says it requires a display or view mode from the Commerce Product entity type. Then I guess the second answer in the linked question is right: install Commerce Product first as that may provide the missing display upon installation.
Even if that doesn't work you may circumvent the issue by creating the display or view mode manually yourself.

Wordpress roots/sage installation options not working

I have install sage on my wordpress, but there no choice for selecting options that sage docs says
During theme installation you will have the options to:
Update theme headers (theme name, description, author, etc.)
Select a CSS framework (Bootstrap, Foundation, Tachyons, none)
Add Font Awesome
Configure Browsersync (path to theme, local development URL)
C:\php7\htdocs\blog\wp-content\themes>composer create-project roots/sage foundat
ion 8.5.3
Installing roots/sage (8.5.3)
- Installing roots/sage (8.5.3): Loading from cache
Created project in foundation
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
- Installing composer/installers (v1.4.0): Loading from cache
Writing lock file
Generating autoload files
I success activate the foundation theme on wordpress dashboard. Is I miss something?
After installing sage 9 there is still no choice for selecting options because TTY mode is not supported on Windows platforms.
To work around it, run these commands from within your theme directory:
./vendor/bin/sage meta
./vendor/bin/sage config
./vendor/bin/sage preset
You are reading the docs for sage 9.x but installing 8.5.3 which is a complete different setup and doesnt have the features mentioned above. Sage 9 can only be installed when running PHP 7.x and up.
If you just use the same composer command without the version number you shouls get the latest version.

ignore dev dependencies in php composer

I have developed a composer laravel based project that I need to install on a remote production server. The problem is I have limited permission/ access so my option is to "archive" the package( using composer archive) and unpack on the production.
What folders do I need to archive and how can I ignore the dev dependencies of the package as well as vendor dev dependencies?
composer archive is likely not to help you, because this command creates an archive of a defined version of a package.
You probably want to upload the whole working application, and not only one package. You should create a little script that will create the archive file for you, which should do:
checkout the application from the repository in a new directory
run composer install --no-dev to install all required dependencies without dev-dependencies
optionally delete files that are not necessary on the server, like documentation, the .git folder, and other stuff
create the archive file from all these files
optionally upload that archive to the target server and unarchive there
optionally check basic functions and switch to the new uploaded version on the server

Use composer ton install depedencies while creating custom WP plugin

I'm really new to composer and don't understand it well (yet).
Here's the thing :
I'm building a Wordpress plugin that needs external libraries.
Thoses libraries are FluentDOM and Selectors-Symfony for FluentDOM.
Both have installation instructions for Composer only :
FluentDOM :
FluentDOM is available on Packagist.org, just add the dependency to your composer.json.
{
"require" : {
"fluentdom/fluentdom": "5.x"
}
}
Selectors-Symfony :
composer require symfony/css-selector
My plugin path is /wordpress/wp-content/my-custom-plugin.
Should I write a composer.json file at the root of this directory, and what should be its content ?
Eventually, I would like install those depedencies in /wordpress/wp-content/my-custom-plugin/_inc/lib
Could anyone explain me how to do this ?
Thanks !
Well, I'd say that unless Wordpress starts supporting Composer (they don't officially at this time although Wordpress can be installed with Composer if you know what you're doing, first and foremost know the package name of it), you shouldn't think too much about using it for delivery of your plugin, meaning: If you use other software in your plugin, I think you have to bundle it inside your plugin, or it won't work.
It still will create issues like "Is the version of the library you are using compatible with the same library other plugins use?" and "How do you do autoloading?" correctly.
Internally, you could use Composer to manage these libraries just like you would do with any other project that uses Composer, with the minor difference that the released package of your plugin must include all these libraries and autoloaders you added - with Composer or something else.
Be warned that I basically don't know anything about how Wordpress people usually organize their stuff. Reading the discussion I linked to in the comment to your question, I get the impression that they have still a very long way to go, and that there is nobody actively behind it and promotes using Composer for dependency management because it also works the usual way, or it might break things.
Internally, you could use Composer to manage these libraries just like
you would do with any other project that uses Composer, with the minor
difference that the released package of your plugin must include all
these libraries and autoloaders you added - with Composer or something
else.
Thanks Sven, that is what I wanted to know.
I finally managed to do it.
Here is my step-by-step guide to install a dependency (here, fluentDOM) into /wordpress/wp-content/plugins/my-custom-plugin/_inc/php with the terminal and without having any composer.json at the start.
First, of course, you need to install Composer. As I will use it for php dependencies of my plugin, I will install it in my-custom-plugin/_inc/php.
(You could also install it at the root of your plugin and adjust following commands)
1/ Open Terminal and go to that directory :
cd /Applications/MAMP/htdocs/my-project/wordpress/wp-content/plugins/my-custom-plugin/_inc/php
2/ Install Composer :
curl -sS https://getcomposer.org/installer | php
Now I'm ready to use Composer in my-custom-plugin/_inc/php.
On the fluentDOM website, I see that the package I need to install is called fluentdom/fluentdom.
3/ So, let's install the package :
composer require fluentdom/fluentdom
If you need more informations about this package, the website packagist could be useful. It shows informations (version, dependencies), ... for composer packages. See fluentdom/fluentdom.
This installs fluentdom in the default composer directory /vendor and generates a composer.json file; which is nice to update dependencies later.
Here's the generated content:
{
"require": {
"fluentdom/fluentdom": "~5.2"
}
}
But we wanted our dependency to be installed into my-custom-plugin/_inc/php, not into my-custom-plugin/_inc/php/vendor !
4/ Let's edit composer.json, and set the default directory parameter vendor-dir to empty.
{
"require": {
"fluentdom/fluentdom": "~5.2"
},
"config": {
"vendor-dir": ""
}
}
5/ Delete the my-custom-plugin/_inc/php/vendor directory as we don't need it anymore.
6/ Now that we have a composer.json file, we just have to run
composer.phar install
Or
composer.phar update
... and the magic happens ! Done !!! We have the dependencies installed, and an autoload.php file generated.
7/ The last thing to do is to include the autoload.php in your plugin :
require_once( plugin_dir_path( __FILE__ ) . '_inc/php/autoload.php' );
This was the way to achieve it without having a composer.json file.
If you have your composer.json file ready, skip steps 3 to 5.
I also suggest to read this blog post : 5 features to know about Composer PHP.

Resources