Coder Social home page Coder Social logo

zodiacmedia / drupal-libraries-installer Goto Github PK

View Code? Open in Web Editor NEW
3.0 3.0 5.0 60 KB

Install Drupal libraries via a simple listing in your composer.json file

Home Page: https://packagist.org/packages/zodiacmedia/drupal-libraries-installer

PHP 100.00%
composer drupal libraries downloader composer-plugin php drupal-plugin

drupal-libraries-installer's Introduction

Drupal Libraries Installer

Drupal Libraries Installer is a composer plugin that allows for easily managing external libraries required for Drupal modules/themes that are not available as composer packages. This plugin is another piece of the puzzle towards managing all external dependencies for a Drupal site in a single place: the composer.json file.

How to Use

  1. Add Drupal Libraries Installer to your Drupal site project:

    composer require zodiacmedia/drupal-libraries-installer
  2. Add libraries to your composer.json file via the drupal-libraries property within extra. A library is specified using its name as the key and a URL to its distribution ZIP/RAR/TAR/TGZ/TAR.GZ/TAR.BZ2 file as the value. It'll attempt to guess the library type from the URL. If the file is not a ZIP file, then the URL must end with the file extension:

    {
        "extra": {
            "drupal-libraries": {
                "chosen": "https://github.com/harvesthq/chosen/releases/download/v1.8.2/chosen_v1.8.2.zip",
                "flexslider": "https://github.com/woocommerce/FlexSlider/archive/2.6.4.zip",
                "moment": "https://registry.npmjs.org/moment/-/moment-2.25.0.tgz"
            }
        }
    }

    Or alternatively if you want to specify a more detailed definition:

    {
        "extra": {
            "drupal-libraries": {
                "chosen": {
                    "url": "https://github.com/harvesthq/chosen/releases/download/v1.8.2/chosen_v1.8.2.zip"
                },
                "flexslider": {
                    "url": "https://github.com/woocommerce/FlexSlider/archive/2.6.4.zip",
                    "version": "2.6.4",
                    "type": "zip",
                    "ignore": ["bower_components", "demo", "node_modules"]
                },
                "moment": {
                    "url": "https://registry.npmjs.org/moment/-/moment-2.25.0.tgz",
                    "shasum": "e961ab9a5848a1cf2c52b1af4e6c82a8401e7fe9"
                },
                "select2": {
                     "url": "https://github.com/select2/select2/archive/4.0.13.zip",
                     "ignore": [
                         ".*",
                         "*.{md}",
                         "Gruntfile.js",
                         "{docs,src,tests}"
                     ],
                     "rename": {
                         "dist": "build"                  
                     }                   
                },
                "custom-tar-asset": {
                     "url": "https://assets.custom-url.com/unconventional/url/path",
                     "type": "tar",
                     "ignore": [".*", "*.{txt,md}"]
                }
            }
        }
    }

    Where the configuration options are as follows:

    • url: The library URL (mandatory).
    • version: The version of the library (defaults to 1.0.0).
    • type: The type of library archive, one of (zip, tar, rar, gzip), support depends on your composer version (defaults to zip).
    • ignore: Array of folders/file globs to remove from the library (defaults to []). See PSA-2011-002.
    • rename: Object mapping of folders/files to rename to fit a certain folder structure (optional).
    • shasum: The SHA1 hash of the asset (optional).

    See below for how to find the ZIP URL for a GitHub repo.

  3. Ensure composer packages of type drupal-library are configured to install to the appropriate path. By default, composer/installers (a dependency of this plugin and likely already included in your project) will install these packages to /libraries/{$name}/ in the root of your repo. You may wish to change this via the installer-paths property (within extra) of your composer.json:

    {
        "extra": {
            "installer-paths": {
                "web/libraries/{$name}/": ["type:drupal-library"]
            }
        }
    }

    See the composer/installers README for more information on the installer-paths property.

  4. Run composer install. Libraries are downloaded and unpacked into place upon running composer install or composer update. (To upgrade a library, simply swap out its URL in your composer.json file and run composer install again.)

Installing libraries declared by other packages.

Set the drupal-libraries-dependencies extra property to true to fetch libraries declared by all the packages in your project. Only the first declaration of the library is ever used, so if you find that multiple packages require different versions of the same library, you can declare the correct version in the project's composer.json.

{
    "extra": {
        "drupal-libraries-dependencies": true
    }
}

Alternatively you can restrict it to specific packages (recommended) by setting it to an array of packages which you'd like to pull in libraries for.

{
    "extra": {
        "drupal-libraries-dependencies": [
          "drupal/project1",
          "drupal/project2"
        ]
    }
}

How to reference an npm package.

For example, if you're interested in downloading version 2.25.0 of the moment npm package.

  • Run npm view [email protected].
  • Use the .tarball value as the library url.
  • Use the .shasum value as the library shasum.

How to Reference a GitHub Repo as a ZIP File

If you are directed to download a library from its GitHub repo, follow these instructions to find a link to the ZIP file version of the code base:

Preferred Method

It is best to reference a specific release of the library so that the same version of code is downloaded every time for each user of the project. To see what releases are available:

  1. Click the X releases link (where X is some number) near the top of the GitHub repo's home page. You can also reach the release page by appending /releases/ to the repo's home page URL, e.g. for https://github.com/harvesthq/chosen, you'd go to https://github.com/harvesthq/chosen/releases/.

  2. Identify which release you'd like to use. You'll likely want to use the latest release unless the module noted a specific version requirement.

  3. For that release, find the "Assets" section. If the repo provides its own distribution ZIP file, that will be listed as one of the first files in the list. If so, you'll want to try using that first in case it includes pre-built files not available directly in the repo. Otherwise, use the "Source code (zip)" link for that release. Simply copy the URL for the desired link to use within your composer.json file.

Alternate Method

If the library does not provide any releases, you can still reference it in ZIP file form. The downside is that any time you download this ZIP, the contents may change based on the state of the repo. There is no guarantee that separate users of the project will have the exact same version of the library. To mitigate against this issue, you should always download a specific commit version rather than from a branch like master.

  1. Click the green Clone or download button on the repo's home page.

  2. Copy the URL for the Download ZIP link to use within your composer.json file.

Library definitions with namespaces

If a library includes a vendor namespace, then its internal package name will be prefixed with a drupal-library_ e.g. vendor/library becomes drupal-library_vendor/library, which in turn allows you to add a custom installer option like the following to manage where it's downloaded:

{
  // composer.json
  "extra": {
    "installer-paths": {
      // Custom installer path entry to store them all under the same folder.
      "web/libraries/myvendor/{$name}": [
        "vendor:drupal-library_ckeditor"
      ],
      "web/libraries/{$name}/": [
        "type:drupal-library"
      ]
    },
    "drupal-libraries": {
      "myvendor/package1": "https://download.myvendor.com/package1-1.0.0.zip",
      "myvendor/package2": "https://download.myvendor.com/package2-1.4.0.zip"
    }
  },
}

Otherwise the files will be stored in web/libraries/myvendor by default and will overwrite each other.

NB: The order of the installer-paths matters.

The justification behind the prefix is to avoid any potential collision with normal composer packages.

Notes

  • This plugin is essentially a shortcut for explicitly declaring the composer package information for each library zip you need to include in your project, e.g.:
    {
        "repositories": [
            {
                "type": "package",
                "package": {
                    "name": "harvesthq/chosen",
                    "version": "1.8.2",
                    "type": "drupal-library",
                    "dist": {
                      "url": "https://github.com/harvesthq/chosen/releases/download/v1.8.2/chosen_v1.8.2.zip",
                      "type": "zip"
                    }
                }
            }
        ],
        "require": {
            "harvesthq/chosen": "1.8.2"
        }
    }
    While that method is perfectly viable and works right out of the box with no additional plugin, it is also cumbersome, not very user-friendly, and quite verbose, adding a lot of additional noise to your composer.json file.
  • Libraries are installed after actual composer packages are installed and are not subject to the dependency-resolving algorithm inherent to composer. What this means is that libraries cannot be specified with a range of compatible versions (rather, a specific version of a library's distribution file must be chosen), and if libraries have any other additional library dependencies of their own, these must be explicitly added to the list.
  • Because libraries are installed after composer packages, it's possible that a library installed by this plugin could overwrite a composer package in the event of an install-path collision.
  • While many libraries are JS- and/or CSS-based and available via npm, there is no way to install these packages directly into the proper /libraries/ folder with npm. As well, modules will often list their external library requirements as links to ZIP distribution files or GitHub repos, making it easier to reference and pull in these dependencies in that manner with this plugin.

drupal-libraries-installer's People

Contributors

balbuf avatar codebymikey avatar kmajzlik avatar

Stargazers

 avatar  avatar

Watchers

 avatar  avatar  avatar

drupal-libraries-installer's Issues

Support short hash in composer install

Under https://github.com/zodiacmedia/drupal-libraries-installer#alternate-method you describe an alternative way to include a library if it has no tags.

To mitigate against this issue, you should always download a specific commit version rather than from a branch like master

Now, if you do this and insert a specific commit in drupal-libraries, i.e.

        "drupal-libraries": {
            "chosen": "https://github.com/harvesthq/chosen/archive/91041bc9dd6867f9a1668050a1b092d92027f13b.zip"
        }

and perform a composer install, actually the following is displayed:

  - Downloading drupal-library/chosen (91041)
  - Installing drupal-library/chosen (91041): Extracting archive

In this case I would expect that the short hash of this commit 91041bc is displayed.

Would it be possible to detect the sha1 i.e. with a regex and then display the short hash when performing a composer install?

Support composer.libraries.json

Instead of having the site builder explicitly set the library version on the site's root composer.json, as a module maintainer, I'd like to be able to specify exactly which version and the installer-name of the library is used when installing my module.

The best option that I've seen upto now for this is what webform does with composer.libraries.json, but this has the undesired side effect of having to use the wikimedia/composer-merge-plugin which is doing a lot more than just installing libraries, and requires a 2nd pass of composer every time.

I'd like an option like:

{
    "extra": {
        "drupal-libraries-include": [
            "web/modules/contrib/module/composer.libraries.json"
        }
    }
}

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.