简体   繁体   中英

Why can't Heroku find my autoload.php file?

I'm setting up a demo site for a Wordpress plugin on Heroku. My plugin uses composer to manage dependencies, and it's configured as a git submodule on my local installation. I push to heroku and everything seems to work. I use heroku run bash to ssh into the app and manually run composer install from inside my plugin. Then I log into the site and try to activate my plugin... but I get the following error:

Plugin could not be activated because it triggered a fatal error.

Warning: require_once(/app/wp-content/plugins/wp-github-pipeline/vendor/autoload.php): failed to open stream: No such file or directory in /app/wp-content/plugins/wp-github-pipeline/wp-github-pipeline.php on line 23 Fatal error: require_once(): Failed opening required '/app/wp-content/plugins/wp-github-pipeline/vendor/autoload.php' (include_path='.:/app/.heroku/php/lib/php') in /app/wp-content/plugins/wp-github-pipeline/wp-github-pipeline.php on line 23

I don't get it. With heroku run bash I can see that the file is actually there. And I don't get this issue locally or on another remote server. Why is it happening here?

在此输入图像描述

在此输入图像描述

I can't say for sure why this worked but it appears that Heroku doesn't really play nicely with composer.json somewhere other than the project root. So I took my project's composer.json and moved it to the project root, then I added...

"config": {
    "vendor-dir": "wp-content/plugins/wp-github-pipeline/vendor"
}

...which caused the dependancies I needed (and the autoload.php) to get installed in the original location.

With this, I am able to push to Heroku normally without issues.

I have NO idea why I was able to run composer install manually without it working. I also have NO idea why heroku run bash would show me files that aren't actually there.

According to me you have to regenerate the autoload. Hope that you have written code within composer.json for autoloads.

composer dump-autoload

This will regenerate your autoload and it will solve your problem. If not please modify your question by pasting your composer.json.

What I did to solve this was add an include_path to my .user.ini file. That ini file needs to be located in the document root , not the app's root.

include_path = ".:/app/.heroku/php/lib/php:/app/vendor/"

Don't copy my include_path example verbatim, as it might now be the needed include path for your app. Get your current include path from Heroku's error log, and then append :/app/vendor to it.

What's important there is adding /app/vendor/ to the include_path. That will point your require php statement to the spot where Heroku puts the autoload.php .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM