ChatGPT解决这个技术问题 Extra ChatGPT

How do I install Composer PHP packages without Composer?

I'm trying to install the Coinbase PHP API but it requires Composer:

https://github.com/coinbase/coinbase-php

I'm looking for a universal PHP solution (perhaps a function) to let me install composer packages directly onto my server, without having to use Composer.

I think the developers of Composer believe they are helping people, but actually there are thousands of beginner developers that are being locked out of learning web development by the 'Composer barrier'.

It would really help if there was a flexible solution or some approach where we could install without Composer? How can I do this?

Please don't respond with some sarcastic comment. There are people that don't want to use Composer and I don't see why we should be herded into a specific third-party software in order to do web development.

All packages using composer are still mere directories full of PHP files. You can install them exactly the same way you did before composer existed: copy them somewhere and include the files.
Composer-based installation implies running a single command, which is almost always shown in the package home page. I understand there're use cases for manual installation but it's never going to be the easier method.
@ÁlvaroGonzález I couldn't disagree with your comment more. Please see: okmaya.com/2016/03/13/package-managers-hate-npm-composer. I'm not saying package managers aren't great for some people and projects - just that they often require more work and effort than simply dropping a folder in your project and referencing it.
@dallin Despite the title, that article is mostly a rant about modern over-engineered frameworks and tool-chains (a problem of its own). If you want to install a library that happens to have 30 dependencies, dumping Composer in favour of 30 manual installs can make you feel more manly or whatever, but I wouldn't call it easier, much less for beginner developers.
@ÁlvaroGonzález To be honest, I haven't had to install a library with 30 dependencies (sounds poorly designed tbh). I'm sure it would be a nightmare without a package manager. My experiences though are similar to that article. I usually try to install something with one or two dependencies and end up having to spend my time troubleshooting the issues with the package manager before I even start coding. Error messages are way too frequent and incredibly vague and esoteric. This might illustrate my feelings better: imgur.com/r/webdev/bO7oTf6. My experiences with PM's have been similar.

j
jahajee.com

You can try https://php-download.com/ which can help you download all dependency most of the time along with vendor folder. It promises composer not required. Tried it myself. It finds and creates all required folders and zips it for download. Works perfectly !!


Working perfectly ! Thanks !!
This should be the accepted answer. It just does what composer does and then returns a zip
The answer above tells so many steps to do while the website eases it to 1 downloadable steps. I am not a programmer professionally but PHP allows me to do insane things so easily that I have never needed to learn SSH or composer or package .... These are meant for geeks and professionals .... The website removed that limitation ..... I believe all those who upvoted my answer finds the website does it better than composer ..... If you can do that .... It will help all non geek programmers
Unfortunately, php-download.com now requires you to subscribe to their site to be able to actually use it :(
It seems the site now requires a paid subscription to download anything.
Á
Álvaro González

The composer.json file lists the dependencies. In your example:

"require": {
    "php": ">=5.5.0",
    "guzzlehttp/guzzle": "^6.0",
    "psr/http-message": "^1.0",
    "psr/log": "^1.0"
},

You must then find the corresponding packages in the packagist site. Repeat the same process for each dependency: find additional dependencies in their corresponding composer.json files and search again.

When you finally have a complete list of the required packages, you only need to install them all one by one. For the most part, it's just a matter of dropping the files somewhere in your project directory. But you must also ensure that PHP can find the needed classes. Since you aren't using Composer's auto-loader, you need to add them to your own custom autoloader. You can figure out the information from the respective composer.json files, e.g.:

"autoload": {
    "psr-4": { "Coinbase\\Wallet\\": "src/" }
},

If you don't use a class auto-loader you'll need to figure out the individual require_once statements. You'll probably need a lot of trial and error because most library authors won't care documenting that.

Also, and just in case there's confusion about this:

Composer has an official GUI installer for Windows and a copy and paste command-line installation procedure for all platforms.

Composer can be run locally and its output just uploaded elsewhere. You don't need SSH in your shared hosting.

The command needed to install a library can be copied and pasted from the package web site—even if the package maintainer didn't care to document it, packagist.org generates it by default.

Composer is not perfect and it doesn't suit all use cases but, when it comes to installing a library that relies on it, it's undoubtedly the best alternative and it's a fairly decent one.

I've checked other answers that came after mine. They mostly fall in two categories:

Install a library and write a custom download script with it Use an online web based interface for Composer

Unless I'm missing something, none of them address the complaints expressed by the OP:

Learning curve

Use of third-party software

Possibility to develop right on the server (using SSH, I presume)

Potentially deep dependency tree


If this doesn't convince everyone to just use composer, nothing will…
First of all the current version of composer needs proc_open() which is not available everywhere. And there are other problems as well. While I agree that composer has its merits I have always known I would run into a problem one day and this day was it. I have yet to figure out how to install a shared library for 50+ client applications (using Composer).
I wish library devs would stop using composer. Its a no-go in any serious production environment. People who hide behind 'just use composer' have no idea what they are doing in the first place.
laughs in JS
I presume that what @ObedMarquezParlapiano is trying to say is that package management is just a tool to address project dependencies, and complaints about the former are often caused by the latter because at least the PHP de-facto standard tool is reasonably reliable, as anyone who's struggled with Node.js's NPM can assert. Of course, I may be wrong.
T
Tschallacka

I'm using shared hosting for a website and can't execute commands there. Aside from running composer via php script request that I request via browser, I usually use this workflow:

Make sure you have php installed locally.

Make directory on desktop.

download composer.phar from https://getcomposer.org/download/ (under header *Manual Download) and place it in the directory.

make a file composer.json paste in it the following contents { "require": { "coinbase/coinbase": "~2.0" } }

Browse to the directory with the shell of your choice(bash, git-bash, cmd, windows bash)

type php composer.phar update

Upload the vendor directory to your webserver via ftp or whatever mechanic you use.

include in your php project where you load your libraries(modify path to where you uploaded the vendor dir so it will include that autoload file) require_once('vendor/autoload.php');

This way you get the benefit of dependency management and you don't have to include manually all the gazillion of files and download all the dependencies manually, and updating them is just as easy as typing php composer.phar update and then replacing the vendor dir on your server with the new one.


j
jsmars

An alternative solution that worked for me (since php-download was down) can be done by making your own little local composer downloader.

Download and install XAMPP locally: https://www.apachefriends.org/index.html Download and install composer locally: https://getcomposer.org/download/ Open commandprompt, navigate to say c:\temp and and simply type the composer dependancy, for example: composer require league/oauth2-client Copy the files from your c:\temp folder to your web host using an FTP program Add this to the top of your php: require("vendor/autoload.php");


Worked like a charm! Thanks for this :)
A
Adam Thompson

I had to do this for an FTP server I didn't have SSH access to. The site listed in here worked, then I realized you can just do a composer install on your own server (using your target's PHP version), then copy all the files over.


That should be the answer. Worked perfectly for me,
Can you please explain your answer better? Sorry for my stupidity.
@IchHabsDrauf Basically he ment to use composer (at this part, its not really the anwser) and than copy over files to production enviroment. My comment to that would be that maybe there are people without composer on dev enviroment too, thus this is not really an anwser.
h
helderk

This is not the ultimate solution but for me it was a big help for most of the cases: https://github.com/Wilkins/composer-file-loader

Allow you to load composer.json file just as composer would do it. This allow you to load composer.json file without composer (so theorically PHP 5.2 is enough)

I know the question is old but I hope it will help someone.


M
Marco Consiglio

Analizing the problem

The problem in installing the dependencies without Composer is the autoloading system.

Composer use a homemade autoloader based on an array map, this is a de-facto standard. But this autoloading system, "fortunally" in this case, is not PSR-4 compliant.

PSR-4 is the de-iure standard for autoload a class in PHP, so you can't escape from autoloading. You must use one of them.

Solution Proposal

In this case, this brilliant PSR-4 autoloader is capable to be manually configured to autoload a VendorClass in a VendorNamespace anywhere in your code, as long as you require the custom autoload.php file early in your source code.

Real life example

Let's look at this example: I have a legacy project who can't and won't use Composer never and never even if God allow this with a miracle. This project can be speed up in development with this fantastic package for command line scripts. This is my project directory structure:

 - src
 - tests
 - vendor (not the Composer's one)

This package has this directory structure:

 - examples
 - src
   - Commando
 - tests

The only thing I need is the src folder. Placing this folder in my vendor folder would be fine. So my custom autoloader would be like this:

// Constants
$base_path = "path\to\my\project";
$autoloader_class = '\vendor\MarcoConsiglio-Wichee\PSR-4-Autoloading\Psr4AutoloaderClass.php';
define("BASE_PATH", str_replace("\\", DIRECTORY_SEPARATOR, $base_path));

// Autoloader
require_once BASE_PATH.'\vendor\MarcoConsiglio-Wichee\PSR-4-Autoloading\Psr4AutoloaderClass.php';

// Init the autoloader.
$package = [
    "nategood\commando" => [
        "namespace" => "Commando",
        "path" => str_replace("\\", DIRECTORY_SEPARATOR, '\vendor\nategood\commando\src\Commando')
    ],
    "kevinlebrun\colors.php" => [
        "namespace" => "Colors",
        "path" => str_replace("\\", DIRECTORY_SEPARATOR, '\vendor\kevinlebrun\colors.php\src\Colors')
    ]
];

// Register namespaces.
$loader = new \PSR4\Psr4AutoloaderClass;
$loader->register();
                      // Namespace                                      // Path to source
$loader->addNamespace($package["nategood\commando"]["namespace"],       BASE_PATH.$package["nategood\commando"]["path"]);
$loader->addNamespace($package["nategood\commando"]["namespace"],       BASE_PATH.$package["nategood\commando"]["path"]."\Util");
$loader->addNamespace($package["kevinlebrun\colors.php"]["namespace"],  BASE_PATH.$package["kevinlebrun\colors.php"]["path"]);

Now I can use the command package anywhere in my project!

Pros & Cons

This solution allow you to:

Easely and manually build your own custom autoloader (you only need to specify the VendorNamespace and the folder(s) where search for VendorClasses in the VendorNamespace.

Freely organize your composer dependency anywhere in your project folder (and why not, outside it)

Import a composer package as is in your project (either downloading locally with Composer or cloning the package repository) or a relevant part of it (i.e removing composer.json file or files that require the composer autoloader).

Cons:

Manually build your custom autoloader means to work on every required dependency of your project (i hope not a lot).

Mistakes in package source paths can be tedious and frustrating.

Works only with PSR-4 compliant file names (i.e. can't use a A.class.php file name)