Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP

Loading…

Add Composer installation support #10

Closed
wants to merge 17 commits into from

19 participants

Henri Bergius Benjamin Eberlei Till! Luis Cordova Brandon Rhodes William Durand Michael Friis Eli White Swift Roman Prokofyev Jose Diaz-Gonzalez Martin Bean Walker Hamilton Phil Sturgeon David Zülke bytefreak Lukas Nowaczek Ryan Schumacher Danny Garcia
Henri Bergius

Composer is the new emerging default way of handling PHP library dependencies. This patch adds support for it that works very similarly to the NPM support in the Node.js buildpack: if there is a composer.json file in an app, then its dependencies are installed with Composer.

Here is a simple example app using it:

http://urlizer-service.herokuapp.com (source code)

Benjamin Eberlei

Shouldn't it verify that "vendor" does not exist in case you shipped the vendors in the package?

bin/compile
@@ -46,6 +46,20 @@ cp $LP_DIR/conf/php.ini php
mkdir -p bin
ln -s /app/php/bin/php bin/php
+# check if we have Composer dependencies and vendors are not bundled
+if if [ -f composer.json ] && [ ! -d vendor ]; then
Benjamin Eberlei
beberlei added a note

sorry to annoy, but wasnt this www/composer.json before? :), since you invoke composer from www also.

Henri Bergius
bergie added a note

FXD :-)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Till!

Two questions:

  1. Is www the public directory on heroku? Is there no way to do this in a directory not exposed to the world?
  2. Can you check if a composer.phar is shipped with the code and use that instead (and not delete it)?
Henri Bergius

@till

  1. I didn't want to make too big changes to how the PHP buildpack works, so yes, this is the public dir. Feel free to submit a PR doing a nicer organization :-)

  2. I could check it, but how likely is that? Is there a good reason to keep an instance of Composer in your own app repository?

Till!

@bergie

I think it's very likely since composer is in an early state. I distribute the phar with all my projects to avoid always going through changes. I update every once in a while though. But e.g. my php_composer resource for chef currently assumes composer.phar in the project as well.

Add to that – it also minimizes the RTs required for an install. And one less dependency on external resources and Internet.

Luis Cordova

@bergie nice, i wonder for sf2 apps, one would need to have things stored under another root project and root/web for public folder. It would be the only thing preventing us from deploying sf2 apps into heroku right?

keeping composer.phar is not a good idea, composer is fetched with the curl or so command on getcomposer.com but it should be done automatically within this package too.

Till!

What do you guys do when getcomposer.org is down? Don't deploy anymore? :)

Luis Cordova

you fork your own, put composer.phar on it and run it

Brandon Rhodes

The PHP buildpack currently caches everything that it needs in S3. I suspect that this is a wise policy that should be continued, instead of relying on getcomposer.org — which would be the first "external" dependency in the whole buildpack, if this pull request were accepted verbatim, I believe?

Henri Bergius

@brandon-rhodes we can easily place a local copy of composer.phar to this if needed. Then this would be sort of similar to the Node.js buildpack, which does include NPM.

William Durand

Bump :+1:

Michael Friis
Owner

When experimenting with this using a standard Symfony2 app I'm getting the error below:

Generating autoload files
Script Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::buildBootstrap handling the post-install-cmd event terminated with an exception

[RuntimeException]                                                             
The php executable could not be found, add it to your PATH environment variable and try again

I've tried augmenting the path to include the php binary like this:

  PATH=$PATH:php/bin
  export PATH

... to no avail. Any suggestions?

William Durand

@friism I guess it makes sense

Eli White

I'm using a different web root for my src so there is no index.php file in the root. However, I still need composer to run to install the dependencies. It seems like the detect script should look for an index.php file OR a composer.json file.

Swift

Any updates on this pull request. Composer support by default would be awesome...

Roman Prokofyev

+1

buzzedword and others added some commits
Danny Garcia buzzedword Update compile
Cleanup after install to make sure no module has a repository left, reducing slug size.

This is re-run every deploy, so these directories are being nuked every time anyway. Might as well save space.
dcca45e
Henri Bergius bergie Merge pull request #2 from buzzedword/patch-1
Update compile
7cebb35
Jose Diaz-Gonzalez

Can this be merged? Would be nice to not have to rebase composer support...

Jose Diaz-Gonzalez

For the record, it appears that the dynamic linking of mcrypt breaks this pretty awesomely:

/tmp/build_2qch10sfzpchy/php/bin/php: error while loading shared libraries: libmcrypt.so.4: cannot open shared object file: No such file or directory

The following is a potential fix, though still buggy because of .so loading errors:

LD_LIBRARY_PATH=$BUILD_DIR/php/ext:$BUILD_DIR/vendor/mcrypt/lib $BUILD_DIR/php/bin/php -c $LP_DIR/conf/php.ini -d detect_unicode=Off composer.phar install --prefer-source

You'll notice I added -d detect_unicode=Off as well as :$BUILD_DIR/vendor/mcrypt/lib to the LD_LIBRARY_PATH.

Martin Bean

Is there any possibility of Composer being added to the native PHP buildpack in the near future?

Walker Hamilton

+1

William Durand

Best PHP buildpack so far is this one: https://github.com/CHH/heroku-buildpack-php.

Jose Diaz-Gonzalez

+1 @willdurand I've been using (and trying to contribute) to that one for a while. It appears there is less support for PHP than for other official heroku buildpacks - based on recent contributions - which sucks but I can totally understand.

https://github.com/CHH/heroku-buildpack-php is legit. A++ would deploy again.

Phil Sturgeon

Two years, no progress. What is going on over here?

Martin Bean

Unfortunately it looks like PHP is a second-class citizen in Heroku land. Thankfully, the guys over at aTech Media are launching their own cloud hosting platform, Viaduct, which has PHP support from the get-go, so I’ll be investigating that as soon as it launches.

William Durand

Well, they hired @dzuelke for improving PHP support, so things should be better at some point.

David Zülke
Owner

Indeed; expect official support to be shipped in early 2014. Composer support is obviously very high up on the list of priorities.

Martin Bean

@dzuelke Glad to hear and to have some sort of timeline. Looking forward to seeing it.

David Zülke
Owner

@martinbean There's also going to be some sort of roadmap as well as more regular announcements in January.

Hinaloe hinaloe referenced this pull request from a commit in hinaloe/heroku-buildpack-php
Ronald Ip iphoting Nginx version: 1.2.6.
Resolves #10.
57c1c4b
bytefreak

@dzuelke hi david. when can we expect composer support exactly? are there now any more information on this?

Martin Bean

Well, Viaduct has launched their beta, with PHP support from the off, and even Composer support. Once I’m comfortable with Viaduct, I’ll be moving all my apps from Heroku to there.

Lukas Nowaczek

The best PHP buildpack was made by awesome @CHH https://github.com/CHH/heroku-buildpack-php

David Zülke
Owner

@bytefreak @martinbean @acedude Email me (dz@) and I'll get you early access to the new PHP support.

Phil Sturgeon

I think I emailed the right place. I'll be very excited to test it out and blog about it when it's ready.

bytefreak

hi @dzuelke. i didn't receive anything.

David Zülke
Owner

Invites are going out tomorrow, @bytefreak

David Zülke
Owner

Composer is now supported in the new version of PHP support on Heroku. Check out the blog post and the Dev Center category with the Getting Started Guide and other resources!

David Zülke dzuelke closed this
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Commits on May 7, 2012
  1. Henri Bergius
  2. Henri Bergius

    Tweak paths for Composer

    bergie authored
  3. Henri Bergius

    More path tweaking

    bergie authored
  4. Henri Bergius

    Try running PHP from build dir

    bergie authored
  5. Henri Bergius

    More PHP path juggling

    bergie authored
Commits on May 8, 2012
  1. Henri Bergius

    Run Composer in verbose mode

    bergie authored
  2. Henri Bergius

    Unset git dir env var

    bergie authored
  3. Henri Bergius

    Typo fix

    bergie authored
  4. Henri Bergius
  5. Henri Bergius
  6. Henri Bergius

    Typo fix

    bergie authored
  7. Henri Bergius

    Use the www dir

    bergie authored
Commits on Jul 27, 2012
  1. Henri Bergius
Commits on Sep 13, 2012
  1. Ryan Schumacher

    Update bin/compile

    jrschumacher authored
    add option to specify php.ini to composer
Commits on Sep 17, 2012
  1. Henri Bergius

    Merge pull request #1 from jrschumacher/master

    bergie authored
    Fix issue with datetime error
Commits on May 30, 2013
  1. Danny Garcia

    Update compile

    buzzedword authored
    Cleanup after install to make sure no module has a repository left, reducing slug size.
    
    This is re-run every deploy, so these directories are being nuked every time anyway. Might as well save space.
  2. Henri Bergius

    Merge pull request #2 from buzzedword/patch-1

    bergie authored
    Update compile
This page is out of date. Refresh to see the latest.
Showing with 15 additions and 0 deletions.
  1. +15 −0 bin/compile
15 bin/compile
View
@@ -46,6 +46,21 @@ cp $LP_DIR/conf/php.ini php
mkdir -p bin
ln -s /app/php/bin/php bin/php
+# check if we have Composer dependencies and vendors are not bundled
+if [ -f www/composer.json ] && [ ! -d www/vendor ]; then
+ GIT_DIR_ORIG=$GIT_DIR
+ unset GIT_DIR
+ echo "-----> Installing Composer dependencies"
+ COMPOSER_URL="http://getcomposer.org/composer.phar"
+ curl --silent --max-time 60 --location "$COMPOSER_URL" > www/composer.phar
+ cd www
+ LD_LIBRARY_PATH=$BUILD_DIR/php/ext $BUILD_DIR/php/bin/php -c $LP_DIR/conf/php.ini composer.phar install --prefer-source
+ rm -rf vendor/**/.git
+ cd $BUILD_DIR
+ rm www/composer.phar
+ export GIT_DIR=$GIT_DIR_ORIG
+fi
+
cat >>boot.sh <<EOF
for var in \`env|cut -f1 -d=\`; do
echo "PassEnv \$var" >> /app/apache/conf/httpd.conf;
Something went wrong with that request. Please try again.