2

Problem

This is a weird one. I simply added this to my composer.json file:

"maatwebsite/excel": "~2.1.0"

Yet when I run composer install, that library doesn't get installed:

composer show | grep excel

returns nothing.

And so every time I run my deployment script I get this error:

> php artisan clear-compiled
PHP Fatal error:  Uncaught Symfony\Component\Debug\Exception\FatalThrowableError: Class 'PHPExcel_Shared_Font' not found in /Users/Shared/dev/php/toters-api/config/excel.php:182
Stack trace:
#0 /Users/Shared/dev/php/toters-api/vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap/LoadConfiguration.php(60): require()
#1 /Users/Shared/dev/php/toters-api/vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap/LoadConfiguration.php(38): Illuminate\Foundation\Bootstrap\LoadConfiguration->loadConfigurationFiles(Object(Illuminate\Foundation\Application), Object(Illuminate\Config\Repository))
#2 /Users/Shared/dev/php/toters-api/vendor/laravel/framework/src/Illuminate/Foundation/Application.php(203): Illuminate\Foundation\Bootstrap\LoadConfiguration->bootstrap(Object(Illuminate\Foundation\Application))
#3 /Users/Shared/dev/php/toters-api/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(267): Illuminate\Foundation\Application->bootstrapWith(Array)
#4 /Users/Shared/dev/php/toters-api/vendor/laravel/framew in /Users/Shared/dev/php/toters-api/config/excel.php on line 182

Fatal error: Uncaught Symfony\Component\Debug\Exception\FatalThrowableError: Class 'PHPExcel_Shared_Font' not found in /Users/Shared/dev/php/toters-api/config/excel.php on line 182

Symfony\Component\Debug\Exception\FatalThrowableError: Class 'PHPExcel_Shared_Font' not found in /Users/Shared/dev/php/toters-api/config/excel.php on line 182

which is an expected error as Composer is ignoring my maatwebsite/excel library!

Workaround

I use these steps to brute force it into working:

rm -rf vendor
rm composer.lock
composer install --no-scripts

but this is clearly an ugly and expensive hack (I've added it as a pre-hook in the envoyer auto deployment), and it works every time but it adds so much time to the auto-deployment process.

References

Question

How can I run a Composer command that forces this to work (but I must also avoid the composer update command because I don't want to update all my libraries during every deployment, as that would cause unpredictable updates to my code base)

Update

enter image description here

I just noticed that this library on our version supports an older version of PHP - could that have to do with it?

Update 2

Running composer require maatwebsite/excel returns the following:

composer require maatwebsite/excel
Using version ^3.0 for maatwebsite/excel
./composer.json has been updated
> php artisan clear-compiled
The compiled class file has been removed.
> php artisan ide-helper:generate
A new helper file was written to _ide_helper.php
Unexpected no document on Illuminate\Database\Eloquent\Model
Wrote expected docblock to /Users/Shared/dev/php/toters-api/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php
> php artisan ide-helper:models -N
Model information was written to _ide_helper_models.php
> php artisan optimize
Generating optimized class loader
The compiled class file has been removed.
Loading composer repositories with package information
Updating dependencies (including require-dev)
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - Conclusion: remove laravel/framework v5.3.31
    - Conclusion: don't install laravel/framework v5.3.31
    - maatwebsite/excel 3.0.1 requires illuminate/support ^5.5 -> satisfiable by illuminate/support[v5.5.0, v5.5.16, v5.5.17, v5.5.2, v5.5.28, v5.5.33, v5.5.34, v5.5.35, v5.5.36, v5.5.37, v5.5.39, v5.5.40, v5.6.0, v5.6.1, v5.6.10, v5.6.11, v5.6.12, v5.6.13, v5.6.14, v5.6.15, v5.6.2, v5.6.3, v5.6.4, v5.6.5, v5.6.6, v5.6.7, v5.6.8, v5.6.9].
    - maatwebsite/excel 3.0.0 requires illuminate/support ^5.6 -> satisfiable by illuminate/support[v5.6.0, v5.6.1, v5.6.10, v5.6.11, v5.6.12, v5.6.13, v5.6.14, v5.6.15, v5.6.2, v5.6.3, v5.6.4, v5.6.5, v5.6.6, v5.6.7, v5.6.8, v5.6.9].
    - don't install illuminate/support v5.5.0|don't install laravel/framework v5.3.31
    - don't install illuminate/support v5.5.16|don't install laravel/framework v5.3.31
    - don't install illuminate/support v5.5.17|don't install laravel/framework v5.3.31
    - don't install illuminate/support v5.5.2|don't install laravel/framework v5.3.31
    - don't install illuminate/support v5.5.28|don't install laravel/framework v5.3.31
    - don't install illuminate/support v5.5.33|don't install laravel/framework v5.3.31
    - don't install illuminate/support v5.5.34|don't install laravel/framework v5.3.31
    - don't install illuminate/support v5.5.35|don't install laravel/framework v5.3.31
    - don't install illuminate/support v5.5.36|don't install laravel/framework v5.3.31
    - don't install illuminate/support v5.5.37|don't install laravel/framework v5.3.31
    - don't install illuminate/support v5.5.39|don't install laravel/framework v5.3.31
    - don't install illuminate/support v5.5.40|don't install laravel/framework v5.3.31
    - don't install illuminate/support v5.6.0|don't install laravel/framework v5.3.31
    - don't install illuminate/support v5.6.1|don't install laravel/framework v5.3.31
    - illuminate/support v5.6.10 conflicts with laravel/framework[v5.3.31].
    - illuminate/support v5.6.11 conflicts with laravel/framework[v5.3.31].
    - illuminate/support v5.6.12 conflicts with laravel/framework[v5.3.31].
    - illuminate/support v5.6.13 conflicts with laravel/framework[v5.3.31].
    - illuminate/support v5.6.14 conflicts with laravel/framework[v5.3.31].
    - illuminate/support v5.6.15 conflicts with laravel/framework[v5.3.31].
    - don't install illuminate/support v5.6.2|don't install laravel/framework v5.3.31
    - don't install illuminate/support v5.6.3|don't install laravel/framework v5.3.31
    - don't install illuminate/support v5.6.4|don't install laravel/framework v5.3.31
    - don't install illuminate/support v5.6.5|don't install laravel/framework v5.3.31
    - don't install illuminate/support v5.6.6|don't install laravel/framework v5.3.31
    - don't install illuminate/support v5.6.7|don't install laravel/framework v5.3.31
    - illuminate/support v5.6.8 conflicts with laravel/framework[v5.3.31].
    - illuminate/support v5.6.9 conflicts with laravel/framework[v5.3.31].
    - Installation request for laravel/framework (locked at v5.3.31, required as 5.3.*) -> satisfiable by laravel/framework[v5.3.31].
    - Installation request for maatwebsite/excel ^3.0 -> satisfiable by maatwebsite/excel[3.0.0, 3.0.1].


Installation failed, reverting ./composer.json to its original content.

which is expected, as the latest version of maatwebsite/excel requires laravel 5.5+,

but when I run composer require maatwebsite/excel:2.1, I still get an error:

./composer.json has been updated
> php artisan clear-compiled
The compiled class file has been removed.
> php artisan ide-helper:generate
A new helper file was written to _ide_helper.php
Tag Exists: @mixin \Eloquent in Illuminate\Database\Eloquent\Model
Tag Exists: @mixin \Illuminate\Database\Eloquent\Builder in Illuminate\Database\Eloquent\Model
Tag Exists: @mixin \Illuminate\Database\Query\Builder in Illuminate\Database\Eloquent\Model
> php artisan ide-helper:models -N
Model information was written to _ide_helper_models.php
> php artisan optimize
Generating optimized class loader
The compiled class file has been removed.
Loading composer repositories with package information
Updating dependencies (including require-dev)
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - Installation request for maatwebsite/excel 2.1 -> satisfiable by maatwebsite/excel[v2.1.0].
    - Conclusion: remove laravel/framework v5.3.31
    - Conclusion: don't install laravel/framework v5.3.31
    - maatwebsite/excel v2.1.0 requires illuminate/filesystem 5.0.*|5.1.*|5.2.* -> satisfiable by illuminate/filesystem[v5.0.0, v5.0.22, v5.0.25, v5.0.26, v5.0.28, v5.0.33, v5.0.4, v5.1.1, v5.1.13, v5.1.16, v5.1.2, v5.1.20, v5.1.22, v5.1.25, v5.1.28, v5.1.30, v5.1.31, v5.1.41, v5.1.6, v5.1.8, v5.2.0, v5.2.19, v5.2.21, v5.2.24, v5.2.25, v5.2.26, v5.2.27, v5.2.28, v5.2.31, v5.2.32, v5.2.37, v5.2.43, v5.2.45, v5.2.6, v5.2.7].
    - don't install illuminate/filesystem v5.0.0|don't install laravel/framework v5.3.31
    - don't install illuminate/filesystem v5.0.22|don't install laravel/framework v5.3.31
    - don't install illuminate/filesystem v5.0.25|don't install laravel/framework v5.3.31
    - don't install illuminate/filesystem v5.0.26|don't install laravel/framework v5.3.31
    - don't install illuminate/filesystem v5.0.28|don't install laravel/framework v5.3.31
    - don't install illuminate/filesystem v5.0.33|don't install laravel/framework v5.3.31
    - don't install illuminate/filesystem v5.0.4|don't install laravel/framework v5.3.31
    - don't install illuminate/filesystem v5.1.1|don't install laravel/framework v5.3.31
    - don't install illuminate/filesystem v5.1.13|don't install laravel/framework v5.3.31
    - don't install illuminate/filesystem v5.1.16|don't install laravel/framework v5.3.31
    - don't install illuminate/filesystem v5.1.2|don't install laravel/framework v5.3.31
    - don't install illuminate/filesystem v5.1.20|don't install laravel/framework v5.3.31
    - don't install illuminate/filesystem v5.1.22|don't install laravel/framework v5.3.31
    - don't install illuminate/filesystem v5.1.25|don't install laravel/framework v5.3.31
    - don't install illuminate/filesystem v5.1.28|don't install laravel/framework v5.3.31
    - don't install illuminate/filesystem v5.1.30|don't install laravel/framework v5.3.31
    - don't install illuminate/filesystem v5.1.31|don't install laravel/framework v5.3.31
    - don't install illuminate/filesystem v5.1.41|don't install laravel/framework v5.3.31
    - don't install illuminate/filesystem v5.1.6|don't install laravel/framework v5.3.31
    - don't install illuminate/filesystem v5.1.8|don't install laravel/framework v5.3.31
    - don't install illuminate/filesystem v5.2.0|don't install laravel/framework v5.3.31
    - don't install illuminate/filesystem v5.2.19|don't install laravel/framework v5.3.31
    - don't install illuminate/filesystem v5.2.21|don't install laravel/framework v5.3.31
    - don't install illuminate/filesystem v5.2.24|don't install laravel/framework v5.3.31
    - don't install illuminate/filesystem v5.2.25|don't install laravel/framework v5.3.31
    - don't install illuminate/filesystem v5.2.26|don't install laravel/framework v5.3.31
    - don't install illuminate/filesystem v5.2.27|don't install laravel/framework v5.3.31
    - don't install illuminate/filesystem v5.2.28|don't install laravel/framework v5.3.31
    - don't install illuminate/filesystem v5.2.31|don't install laravel/framework v5.3.31
    - don't install illuminate/filesystem v5.2.32|don't install laravel/framework v5.3.31
    - don't install illuminate/filesystem v5.2.37|don't install laravel/framework v5.3.31
    - don't install illuminate/filesystem v5.2.43|don't install laravel/framework v5.3.31
    - don't install illuminate/filesystem v5.2.45|don't install laravel/framework v5.3.31
    - don't install illuminate/filesystem v5.2.6|don't install laravel/framework v5.3.31
    - don't install illuminate/filesystem v5.2.7|don't install laravel/framework v5.3.31
    - Installation request for laravel/framework (locked at v5.3.31, required as 5.3.*) -> satisfiable by laravel/framework[v5.3.31].


Installation failed, reverting ./composer.json to its original content.

which is weird, as it should support Laravel 5.3 (my Laravel):

enter image description here

but my PHP version is 7.1.

halfer
  • 19,824
  • 17
  • 99
  • 186
abbood
  • 23,101
  • 16
  • 132
  • 246
  • 1
    Have you tried composer update – Jigs1212 Mar 31 '18 at 04:46
  • @Jigs1212 I knew someone would suggest that, yes tried it and it worked.. but I just updated my question to specifically avoid using composer update b/c it has undesirable side effects – abbood Mar 31 '18 at 04:47
  • in that case u should use composer require and that package name in ur case composer require maatwebsite/excel – Jigs1212 Mar 31 '18 at 04:51

3 Answers3

6

composer install is not like npm install. I'm pretty sure if you manually add a package like you did it's ignored, as composer.lock is already there.

  • Doing composer update would have worked.
  • Or adding the package by doing composer require maatwebsite/excel
  • Or removing composer.lock and then running composer install

Edit:

composer require maatwebsite/excel will attempt to install the latest version of that package but because you are using laraval v5.3.31 you should install maatwebsite/excel ~2.1.0 instead. Version 3 is for laraval ^5.5

  • composer require "maatwebsite/excel:~2.1.0"
Lawrence Cherone
  • 46,049
  • 7
  • 62
  • 106
  • running `composer quire maatwebsite/excel` will do the same thing as adding `"maatwebsite/excel": "~2.1.0"` to composer.json, so that step is already tried – abbood Mar 31 '18 at 05:10
  • _Or removing composer.lock and then running composer install_ will result in this error: `Using global Composer installation. > php artisan clear-compiled Warning: require(/home/forge/default/envoyer/releases/20180331050930/bootstrap/../vendor/autoload.php): failed to open stream: No such file or directory in /home/forge/default/envoyer/releases/20180331050930/bootstrap/autoload.php on line 17` – abbood Mar 31 '18 at 05:11
  • composer require is not the same as adding it manually then running install, as them two commands do different things when the `composer.lock` file is present. By removing the composer.lock file, your essentially just pulling in all vendors again if not cached. – Lawrence Cherone Mar 31 '18 at 05:13
  • The other error is because you deleted vendor folder, which you didnt need to do, you will now need to just do `composer install` again (after deleting the lock file). – Lawrence Cherone Mar 31 '18 at 05:14
  • Also looks like you got atomic versioning going on with envoyer, just roll back and then do `composer require maatwebsite/excel` – Lawrence Cherone Mar 31 '18 at 05:16
  • I tried the composer require.. but there are still errors (please see update 2) – abbood Mar 31 '18 at 05:45
  • Its another problem, ok that lib requires `"illuminate/support": "^5.5"` but laraval v5.3.31 installs `"illuminate/support": "v5.3.31"`. because versions are tight with laraval your need to find a version of the lib which works with v5.3.31, your be able to trace that on packagist. – Lawrence Cherone Mar 31 '18 at 05:58
  • Install this instead: https://packagist.org/packages/maatwebsite/excel#2.1.27 its v2.1 instead of v3.0 version of that lib..a *major* version mean *breaking*, your need laraval 5.5 to run 3.0.. – Lawrence Cherone Mar 31 '18 at 06:02
  • I just noticed your image in the question update, that's what its saying, you may have php7.1 but your running laravel v5.3.31 so you need v2.1 of the lib. Once laravel v5.6 is released, the whole breaking starts again, one of the many reasons I don't use laraval – Lawrence Cherone Mar 31 '18 at 06:07
  • quick question, how do i find out what verison of `illuminate/support` i _actually_ got installed? that thing isn't showing up (or any other illuminate library for that matter) when i run `composer show`.. as detailed in update 2, i already tried installing version 2.1 by running `maatwebsite/excel:2.1` but that caused all the other errors.. so i'll have to resolve this illuminate/support dependency manually – abbood Mar 31 '18 at 08:19
  • https://github.com/laravel/framework/blob/5.3/composer.json#L69 `self.version` = the laravel version so v5.3.31 – Lawrence Cherone Mar 31 '18 at 08:21
  • Ok man I'm stuck.. how do I override laravels own version of a library? Do I simply list it as a requirement in composer? Wouldn't that just create another conflict with laravel 5.3? – abbood Mar 31 '18 at 08:32
  • But that conflict *is* happening on version 2.1.. I *do* have an issue – abbood Mar 31 '18 at 08:35
  • Let us [continue this discussion in chat](https://chat.stackoverflow.com/rooms/167923/discussion-between-lawrence-cherone-and-abbood). – Lawrence Cherone Mar 31 '18 at 08:37
  • I'm still not quite sure why most of the time.. whenever I add a new library.. I simply add an entry in the composer.json file, then running composer install installs the library (or else outputs an error when the library has problems) and updates composer.lock. only this time this didn't work.. I _had_ to do composer require – abbood Mar 31 '18 at 11:27
2

never never never ever delete composer.lock - unless you really understand what this means and are willing to take the consequences.

You get the installation by just calling:

composer require maatwebsite/excel:~2.1

Which then installs version 2.1.27.

Just a few words regarding your "error" messages. There it says that maatwebsite/excel v2.1.0 requires illuminate/filesystem 5.0.*|5.1.*|5.2.*. This package is replaced by laravel in the same version (you can "read" this in the composer.lock). But you are using laravel 5.3.31 ergo there is a version conflict. But a newer version from maatwebsite/excel is compatible with more versions of illuminate/*.

Norman M
  • 243
  • 1
  • 9
  • Why is it such a bad idea to delete composer.lock? – abbood Apr 01 '18 at 06:15
  • Because it invalidates your saved and hopefully tested working project. After deleting the log many new package versions will be installed and everything has to be retested. There is a link at the beginning of composer.lock for further reading – Norman M Apr 01 '18 at 22:38
0

In your case you can try composer require and that package name that is

composer require maatwebsite/excel 
Jigs1212
  • 773
  • 8
  • 20