Simple static Composer repository generator - For a full private Composer repo use Private Packagist

Last update: May 25, 2022

Satis

Simple static Composer repository generator.

Run from source

Satis requires a recent PHP version, it does not run with unsupported PHP versions. Check the composer.json file for details.

  • Install satis: composer create-project composer/satis:dev-main
  • Build a repository: php bin/satis build <configuration-file> <output-directory>

Read the more detailed instructions in the documentation.

Run as Docker container

Pull the image:

docker pull composer/satis

Run the image (with Composer cache from host):

docker run --rm --init -it \
  --user $(id -u):$(id -g) \
  --volume $(pwd):/build \
  --volume "${COMPOSER_HOME:-$HOME/.composer}:/composer" \
  composer/satis build <configuration-file> <output-directory>

If you want to run the image without implicitly running Satis, you have to override the entrypoint specified in the Dockerfile:

--entrypoint /bin/sh

Purge

If you choose to archive packages as part of your build, over time you can be left with useless files. With the purge command, you can delete these files.

php bin/satis purge <configuration-file> <output-dir>

Note: don't do this unless you are certain your projects no longer reference any of these archives in their composer.lock files.

Updating

Updating Satis is as simple as running git pull && composer install in the Satis directory.

If you are running Satis as a Docker container, simply pull the latest image.

Contributing

Please note that this project is released with a Contributor Code of Conduct. By participating in this project you agree to abide by its terms.

Fork the project, create a feature branch, and send us a pull request.

If you introduce a new feature, or fix a bug, please try to include a testcase.

Authors

See the list of contributors who participate(d) in this project.

Community Tools

  • satis-go - A simple web server for managing Satis configuration and hosting the generated Composer repository.
  • satisfy - Symfony based composer repository manager with a simple web UI.
  • satis-control-panel - Simple web UI for managing your Satis Repository with optional CI integration.
  • composer-satis-builder - Simple tool for updating the Satis configuration (satis.json) "require" key on the basis of the project composer.json.

Examples

License

Satis is licensed under the MIT License - see the LICENSE file for details

GitHub

https://github.com/composer/satis
Comments
  • 1. Update Satis UI to Bootstrap 4

    This PR freshens up the Satis UI by upgrading it from Bootstrap 3 to Bootstrap 4. It also updates the JavaScript code, which has been converted to modern ES6 classes.

    Some things worth noting:

    • Both CSS and JS have been compiled using Webpack (with Webpack Encore for an easier setup).
    • Overall assets size has dropped from ~280Kb to ~180Kb.
    • Contains a longer explanation on how to set up the repository, which I largely took from here.

    Here's how it looks: Screenshot 1

    And here is the detail of the setup info: screenshot 2

    Reviewed by antoniocambados at 2018-10-21 17:51
  • 2. Added "enforce-dependencies" option to enforce constraints on packages

    Context/Problem : when using satis with the option "require-dependencies" : "true" and not in "require-all" mode, satis is resolving required dependencies to deduce which package versions should be downloaded. When you set a constraint on a package in the satis json, unfortunately if a dependency (or a dependency of a dependency) is declaring broader versions, then satis will fetch those additionnal versions.

    Proposed solution : i added a new option named "enforce-dependencies" which allow to restrict dependencies on downloaded packages.

    Remark : the patch is really not perfect, and i'm new to the satis source code, i will be happy to discuss that change.

    Reviewed by mikaelmeulle at 2018-03-27 15:36
  • 3. Allow to run a satis build for one repo/package

    Added an additional flag to generate the satis build for a single package. This helps to speed up the satis run if you have to deal with a lot of repos. In our case Jenkins will trigger the satis build after a new release was created. Since we have a lot packages (with a lot of versions) in our local satis repo, I was looking for a way to speed up the satis run.

    Reviewed by shochdoerfer at 2014-02-25 10:50
  • 4. Add prettier and eslint

    • Adds prettier and eslint with pre-commit hooks so that relevant files are linted and formatted during commit
    • Latest version of Encore now supports latest version of sass-loader, so bump all dependencies
    • Remove the one usage of optional chaining, it wasn't needed and violates the new eslint rules
    • Remove unused popper.js dependency
    • Expose script for composer test so you can run the project's tests with the same version of PHPUnit that the CI checks will use
    Reviewed by theimbender at 2021-02-15 14:23
  • 5. ErrorException: copy(/tmp/composer_archive60e5622111255.tar): Failed to open stream: No such file or directory

    Hello, I've deployed a satis instance using the satis.json from k8s : 1、the configmap file is below:

    apiVersion:` v1
    kind: ConfigMap
    metadata:
      name: satis-config-cm
      namespace: martin-test
    data:
      satis.json: |-
        {
            "name": "martin/composer-repository",
            "homepage": "https://satis.martin.com",
            "require": {
                "guzzlehttp/guzzle": "^6.5",
                "illuminate/redis": "5.7.*",
                "jenssegers/mongodb": "3.4.*",
                "laravel/lumen-framework": "5.7.*",
                "lcobucci/jwt": "^3.3",
                "overtrue/socialite": "^2.0",
                "predis/predis": "^1.1",
                "ramsey/uuid": "^3.9",
                "vlucas/phpdotenv": "~2.2",
                "fzaninotto/faker": "~1.4",
                "mnabialek/laravel-sql-logger": "^2.2",
                "mockery/mockery": "~1.0",
                "phpunit/phpunit": "~7.0",
                "yiisoft/yii2": ">=2.0.13",
                "yiisoft/yii2-bootstrap": "*",
                "yiisoft/yii2-swiftmailer": "*",
                "feehi/yii2-swoole": ">=0.0.5",
                "feehi/yii2-cdn" : "*",
                "yiisoft/yii2-imagine": "^2.1",
                "qcloudsms/qcloudsms_php": "0.1.*",
                "kartik-v/yii2-widget-select2": "@dev",
                "moonlandsoft/yii2-phpexcel": "*",
                "kartik-v/yii2-export":"*",
                "kartik-v/yii2-widget-datetimepicker":"*",
                "kartik-v/yii2-date-range":"dev-master",
                "yiisoft/yii2-redis": "^2.0",
                "sizeg/yii2-jwt": "^2.0",
                "yiisoft/yii2-queue": "^2.3",
                "yiisoft/yii2-debug": "~2.0.0",
                "yiisoft/yii2-gii": "~2.0.0",
                "yiisoft/yii2-faker": "~2.0.0",
                "codeception/base": "^2.2.3",
                "codeception/verify": "~0.3.1",
                "guzzlehttp/guzzle": ">=4.1.4 <7.0",
                "fxp/composer-asset-plugin": "*",
                "bower-asset/yii2-pjax": "~2.0.1",
                "bower-asset/typeahead.js": "0.10.* | ~0.11.0",
                "bower-asset/punycode": "1.3.*",
                "bower-asset/jquery": "3.4.*",
                "bower-asset/inputmask": "~3.2.2 | ~3.3.5",
                "bower-asset/bootstrap": "3.4.* | 3.3.* | 3.2.* | 3.1.*",
                "encore/laravel-admin": "1.6.13",
                "fideloper/proxy": "~3.3",
                "intervention/image": "^2.5",
                "laravel/framework": "5.5.*",
                "laravel/tinker": "~1.0",
                "maatwebsite/excel": "2.1.30 | 3.0.1 | 3.1.10 | 3.1.15 | 3.1.16 | 3.1.17",
                "nesbot/carbon": "^1.29.1",
                "qcloud/cos-sdk-v5": "2.0.3",
                "filp/whoops": "~2.0",
                "symfony/thanks": "^1.0",
                "tencentcloud/tencentcloud-sdk-php": ">=3.0.400 < 3.0.410",
                "tymon/jwt-auth": "^1.0",
                "php-ffmpeg/php-ffmpeg": "^0.18.0"
            },
            "archive": {
                "directory": "dist",
                "format": "tar",
                "prefix-url": "https://satis.martin.com",
                "skip-dev": true
            },
            "require-all": false,
            "require-dependencies": true,
            "require-dev-dependencies": true,
            "repositories": [
                { "type": "composer", "url": "https://mirrors.aliyun.com/composer/" },
                { "type": "composer", "url": "https://asset-packagist.cn" }
            ]
        }
    

    and i have deployed the satis pod using the persistent volumn that is the way of hostpath

    2、the deployment file is below:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: satis-app
      namespace: martin-test
      labels:
        app: satis-app
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: satis-app
      template:
        metadata:
          labels:
            app: satis-app
        spec:
          hostAliases:
          - ip: "10.0.3.90"
            hostnames:
            - "git.martin.com"
          - ip: "10.0.3.40"
            hostnames:
            - "satis.martin.com"
          containers:
            - name: composer
              image: composer/satis:latest
              #imagePullPolicy: Always
              workingDir: /build
              volumeMounts:
              - name: build-data
                mountPath: /build/output
              - name: satis-config-cm
                mountPath: /build/satis.json
                subPath: satis.json
              - name: satis-composer-cm
                mountPath: /composer/composer.json
                subPath: composer.json
              env:
                - name: TZ
                  value: "Asia/Shanghai"
            - name: nginx
              image: "nginx:1.17.9"
              #imagePullPolicy: Always
              workingDir: /etc/nginx/conf.d
              env:
                - name: TZ
                  value: "Asia/Shanghai"
              volumeMounts:
              - mountPath: /data/wwwroot/satis
                name: build-data
              - mountPath: /etc/nginx/conf.d/ 
                name: satis-nginx-cm
              - mountPath: /data/logs/nginx
                name: satis-logs-pvc
                #subPath: nginx
              ports:
                - name: http
                  containerPort: 80
                  protocol: TCP
          imagePullSecrets:
          - name: qcloudregistrykey
          - name: tencenthubkey
          volumes:
          - name: build-data
            #emptyDir: {}
            #persistentVolumeClaim:
            #  claimName: satis-data-pvc
            hostPath:
              #path: /var/lib/docker/satis_data_modify
              path: /var/lib/docker/satis_data
          - name: satis-logs-pvc
            emptyDir: {}
          - name: satis-nginx-cm
            configMap:
              name: satis-nginx
          - name: satis-config-cm
            configMap:
              name: satis-config-cm
          - name: satis-composer-cm
            configMap:
              name: satis-composer-cm
          nodeSelector:
            satis: "true"
    

    but when the pod is running, i find the error logs: image

    could you help me to solve the problem, thanks very much!

    Reviewed by hannius at 2021-07-07 09:05
  • 6. Permission bits are lost in archives

    It seems that files in archived packages are loosing permission bits on Linux, in my case the executable flag which was set for a php file. I tried both zip and tar archive formats.

        "archive": {
            "directory": "dist",
            "skip-dev": true,
            "format": "tar"
        }
    

    The permission bits are preserved if I use the --prefer-source flag while installing the package.

    I also tried to create an archive using composer archive which has the same problem.

    Is there a way to preserve the permission bits in archives on Linux? Thanks

    Reviewed by doalex at 2016-03-22 15:31
  • 7. Many silent failures == inability to create repo

    I'm attempting to rebuild the ZF2 composer repository (https://packages.zendframework.com), as we have recently split our components into dedicated development repositories (which has necessitated changing URIs).

    The satis.json I'm working with is this:

    {
      "name": "Zend Framework Repository",
      "homepage": "https://packages.zendframework.com",
      "repositories": [
        {"type": "vcs", "url": "https://github.com/zendframework/zend-authentication.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/zend-barcode.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/zend-cache.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/zend-captcha.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/zend-code.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/zend-config.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/zend-console.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/zend-crypt.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/zend-db.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/zend-debug.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/zend-di.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/zend-dom.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/zend-escaper.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/zend-eventmanager.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/zend-feed.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/zend-file.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/zend-filter.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/zend-form.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/zend-http.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/zend-i18n.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/zend-i18n-resources.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/zend-inputfilter.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/zend-json.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/zend-ldap.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/zend-loader.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/zend-log.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/zend-mail.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/zend-math.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/zend-memory.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/zend-mime.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/zend-modulemanager.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/zend-mvc.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/zend-navigation.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/zend-paginator.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/zend-permissions-acl.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/zend-permissions-rbac.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/zend-progressbar.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/zend-serializer.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/zend-server.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/zend-servicemanager.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/zend-session.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/zend-soap.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/zend-stdlib.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/zend-tag.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/zend-test.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/zend-text.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/zend-uri.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/zend-validator.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/zend-version.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/zend-view.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/zend-xmlrpc.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/ZendCloud.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/ZendDeveloperTools.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/ZendGData.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/ZendOAuth.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/ZendOpenId.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/ZendPdf.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/ZendQueue.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/ZendRest.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/ZendService_AgileZen.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/ZendService_Akismet.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/ZendService_Amazon.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/ZendService_Api.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/ZendService_Apple_Apns.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/ZendService_Audioscrobbler.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/ZendService_Delicious.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/ZendService_DeveloperGarden.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/ZendService_Flickr.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/ZendService_GoGrid.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/ZendService_Google_C2dm.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/ZendService_Google_Gcm.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/ZendService_LiveDocx.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/ZendService_Nirvanix.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/ZendService_OpenStack.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/ZendService_Rackspace.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/ZendService_ReCaptcha.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/ZendService_SlideShare.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/ZendService_StrikeIron.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/ZendService_Technorati.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/ZendService_Twitter.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/ZendService_WindowsAzure.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/ZendXml.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/ZendSkeletonApplication.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/zf1.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/zf2.git"},
        {"type": "vcs", "url": "https://github.com/zendframework/ZFTool.git"},
        {"type": "vcs", "url": "https://github.com/zfcampus/zf-angular.git"},
        {"type": "vcs", "url": "https://github.com/zfcampus/zf-apigility.git"},
        {"type": "vcs", "url": "https://github.com/zfcampus/zf-apigility-admin.git"},
        {"type": "vcs", "url": "https://github.com/zfcampus/zf-apigility-admin-ui.git"},
        {"type": "vcs", "url": "https://github.com/zfcampus/zf-apigility-doctrine.git"},
        {"type": "vcs", "url": "https://github.com/zfcampus/zf-apigility-documentation.git"},
        {"type": "vcs", "url": "https://github.com/zfcampus/zf-apigility-documentation-swagger.git"},
        {"type": "vcs", "url": "https://github.com/zfcampus/zf-apigility-example.git"},
        {"type": "vcs", "url": "https://github.com/zfcampus/zf-apigility-provider.git"},
        {"type": "vcs", "url": "https://github.com/zfcampus/zf-apigility-skeleton.git"},
        {"type": "vcs", "url": "https://github.com/zfcampus/zf-apigility-welcome.git"},
        {"type": "vcs", "url": "https://github.com/zfcampus/zf-api-problem.git"},
        {"type": "vcs", "url": "https://github.com/zfcampus/zf-configuration.git"},
        {"type": "vcs", "url": "https://github.com/zfcampus/zf-console.git"},
        {"type": "vcs", "url": "https://github.com/zfcampus/zf-content-negotiation.git"},
        {"type": "vcs", "url": "https://github.com/zfcampus/zf-content-validation.git"},
        {"type": "vcs", "url": "https://github.com/zfcampus/zf-deploy.git"},
        {"type": "vcs", "url": "https://github.com/zfcampus/zf-development-mode.git"},
        {"type": "vcs", "url": "https://github.com/zfcampus/zf-doctrine-querybuilder.git"},
        {"type": "vcs", "url": "https://github.com/zfcampus/zf-hal.git"},
        {"type": "vcs", "url": "https://github.com/zfcampus/zf-http-cache.git"},
        {"type": "vcs", "url": "https://github.com/zfcampus/zf-mvc-auth.git"},
        {"type": "vcs", "url": "https://github.com/zfcampus/zf-oauth2.git"},
        {"type": "vcs", "url": "https://github.com/zfcampus/zf-rest.git"},
        {"type": "vcs", "url": "https://github.com/zfcampus/zf-rpc.git"},
        {"type": "vcs", "url": "https://github.com/zfcampus/zf-versioning.git"}
      ],
      "require-all": true,
      "archive": {
        "directory": "composer",
        "format": "zip",
        "skip-dev": false
      }
    }
    

    I then execute this using

    $ ./bin/satis build ./satis.json ../../public
    

    I have run into several errors, however, that I cannot figure out how to recover from.

    First, frequent errors of the following nature:

    ZipArchive::extractTo(...) : failed to open stream: Invalid argument
    

    The only way to recover from the above is to remove the line for that component, unfortunately.

    Second, I am frequently seeing 255 exit status codes with no error information whatsoever, even when running using -vvv. The specific one that tends to create the 255 error code regularly is zendframework/zendframework1:1.12.0; I have a sneaking suspicion that we may be hitting either a timeout or memory condition (as it's a very, very large package).

    The end result of both, however, is that I am unable to complete a build of the repository with the full set of components we wish to provide.

    Any tips or suggestions are welcome.

    Reviewed by weierophinney at 2015-05-28 18:50
  • 8. Github Webhook Integration

    Github has this wonderful feature of webhooks, which is beautifully generic. Now instead of running a satis update every 2 minutes, wouldn't it be much more convenient to run the update only when the webhook is called? Our installation has only a handful of repos in it, mostly libraries that change either multiple times in a day or then not for days or even weeks. So instead of running a cronjob every 5 minutes to ensure the packages.json is fresh, the webhook would be the ideal candidate for the task.

    I'm currently working on creating something like this. I don't know yet how exactly I'll be implementing it, but I would love to hear input, so maybe I can publish my efforts here later.

    Reviewed by ChristianRiesen at 2012-09-26 08:59
  • 9. support vcs on repos without composer.json

    info: i use the yaml to json converter, so the following config parts are yml styled.

    for example, if i want to include twitter bootstrap from the official repo, the following code works quite well:

    repositories:
        # twitter/bootstrap
        - { type: package, package: { name: twitter/bootstrap, version: 2.0.0, source: { url: 'https://github.com/twitter/bootstrap.git', type: git, reference: v2.0.0 } } }
        - { type: package, package: { name: twitter/bootstrap, version: 2.0.1, source: { url: 'https://github.com/twitter/bootstrap.git', type: git, reference: v2.0.1 } } }
        - { type: package, package: { name: twitter/bootstrap, version: 2.0.2, source: { url: 'https://github.com/twitter/bootstrap.git', type: git, reference: v2.0.2 } } }
        - { type: package, package: { name: twitter/bootstrap, version: 2.0.3, source: { url: 'https://github.com/twitter/bootstrap.git', type: git, reference: v2.0.3 } } }
        - { type: package, package: { name: twitter/bootstrap, version: 2.0.4, source: { url: 'https://github.com/twitter/bootstrap.git', type: git, reference: v2.0.4 } } }
        - { type: package, package: { name: twitter/bootstrap, version: 2.1.0, source: { url: 'https://github.com/twitter/bootstrap.git', type: git, reference: origin/2.1.0-wip } } }
    

    php bin/satis --verbose build config/config.json ../web/ produces a nice packages file

    Scanning packages
    Selected twitter/bootstrap (2.0.0)
    Selected twitter/bootstrap (2.0.1)
    Selected twitter/bootstrap (2.0.2)
    Selected twitter/bootstrap (2.0.3)
    Selected twitter/bootstrap (2.0.4)
    Selected twitter/bootstrap (2.1.0)
    

    but having

    repositories:
        # twitter/bootstrap
        - { type: vcs, url: 'https://github.com/twitter/bootstrap.git' } #no composer
    

    leads to

    Reading composer.json of https://github.com/twitter/bootstrap.git (v1.2.0)
    Skipped tag v1.2.0, no composer file
    Reading composer.json of https://github.com/twitter/bootstrap.git (v1.1.1)
    Skipped tag v1.1.1, no composer file
    Reading composer.json of https://github.com/twitter/bootstrap.git (v1.1.0)
    Skipped tag v1.1.0, no composer file
    Reading composer.json of https://github.com/twitter/bootstrap.git (v1.0.0)
    Skipped tag v1.0.0, no composer file
    Reading composer.json of https://github.com/twitter/bootstrap.git (v1.4.0)
    ... snip ...
    Reading composer.json of https://github.com/twitter/bootstrap.git (v2.0.2)
    Skipped tag v2.0.2, no composer file
    Reading composer.json of https://github.com/twitter/bootstrap.git (2.1.0-wip)
    Skipped branch 2.1.0-wip, no composer file
    Reading composer.json of https://github.com/twitter/bootstrap.git (gh-pages)
    Skipped branch gh-pages, no composer file
    Reading composer.json of https://github.com/twitter/bootstrap.git (master)
    Skipped branch master, no composer file
    

    so this is unhelpful. satis connects to the repo, reads the tag and uses it for an error message. why not generate

    repositories:
        # twitter/bootstrap
        - { type: package, package: { name: twitter/bootstrap, version: %%calculated_version_number%%, source: { url: 'https://github.com/twitter/bootstrap.git', type: git, reference: %%tag_or_branch_composer_read%% } } }
        ...
    

    this would really help and also really push composer. the only difficult here is to caclulate the %%calculated_version_number%% from the %%tag_or_branch_composer_read%%

    where to add this code? satis is using composer, does satis generate this error meassage or is it composer? where to add what? if you can lead me the right direction i can try building a PR

    Reviewed by c33s at 2012-06-29 10:05
  • 10. Please tag a version

    Hi,

    I've started to use Satis as a local repository for managing dependencies. However it does not have any tags so it is not possible to use Composer to install a known reliable version of Satis, instead only the latest dev master can be installed.

    Please could you start tagging Satis?

    cheers Dan

    Reviewed by Danack at 2013-08-18 23:56
  • 11. Support composer 2.0 output format

    Adds a new option to output packages following the new composer 2.0 format. Keep the existing package dumps for compatibility with composer 1.

    Example for this simple satis.json:

    {
      "name": "corp/satis",
      "homepage": "http://127.0.0.1",
      "repositories": [
        {"type": "vcs", "url": "https://github.com/php-fig/log"},
        {"type": "vcs", "url": "[email protected]:Seldaek/monolog.git"}
      ]
    }
    

    Output structure: image

    Notes:

    • The new option "minified": "composer/2.0" has not been implemented, since it requires composer 2.0.
    • "available-packages" can be implemented later.
    • provider-api can be implemented later.
    Reviewed by GromNaN at 2020-04-19 21:41
  • 12. RFC: Compatibility with composer/composer 2.3.x

    Describe the bug I believe satis is no longer working with Composer 2.3:

    To Reproduce Try a satis build with Composer 2.3

    Outcome

    $ php satis/bin/satis build -vvv satis.json /var/jenkins_home/composer-repo
    
    In BaseCommand.php line 59:
    [RuntimeException]                                                           
    Composer commands can only work with an Composer\Console\Application instance set
    
    Exception trace:
      at /var/jenkins_home/jobs/XXX/jobs/satis-update/workspace/satis/vendor/composer/composer/src/Composer/Command/BaseCommand.php:59
     Composer\Command\BaseCommand->getApplication() at /var/jenkins_home/jobs/XXX/jobs/satis-update/workspace/satis/src/Console/Command/BuildCommand.php:183
     Composer\Satis\Console\Command\BuildCommand->execute() at /var/jenkins_home/jobs/XXX/jobs/satis-update/workspace/satis/vendor/symfony/console/Command/Command.php:298
     Symfony\Component\Console\Command\Command->run() at /var/jenkins_home/jobs/XXX/jobs/satis-update/workspace/satis/vendor/symfony/console/Application.php:1015
     Symfony\Component\Console\Application->doRunCommand() at /var/jenkins_home/jobs/XXX/jobs/satis-update/workspace/satis/vendor/symfony/console/Application.php:299
     Symfony\Component\Console\Application->doRun() at /var/jenkins_home/jobs/XXX/jobs/satis-update/workspace/satis/src/Console/Application.php:49
     Composer\Satis\Console\Application->doRun() at /var/jenkins_home/jobs/XXX/jobs/satis-update/workspace/satis/vendor/symfony/console/Application.php:171
     Symfony\Component\Console\Application->run() at /var/jenkins_home/jobs/XXX/jobs/satis-update/workspace/satis/bin/satis:60
    
    build [--repository-url REPOSITORY-URL] [--repository-strict] [--no-html-output] [--skip-errors] [--stats] [--minify] [--] [<file> [<output-dir> [<packages>...]]]
    

    Expected behavior

    $ php satis/bin/satis build -vvv satis.json /var/jenkins_home/composer-repo
    
    Loading config file /var/jenkins_home/jobs/XXX/jobs/satis-update/workspace/auth.json
    Checked CA file /etc/pki/tls/certs/ca-bundle.crt does not exist or it is not a file.
    Checked directory /etc/pki/tls/certs/ca-bundle.crt does not exist or it is not a directory.
    Checked CA file /etc/ssl/certs/ca-certificates.crt: valid
    Executing command (/var/jenkins_home/jobs/XXX/jobs/satis-update/workspace): git branch -a --no-color --no-abbrev -v
    Executing command (/var/jenkins_home/jobs/XXX/jobs/satis-update/workspace): git rev-list remotes/origin/master..ab5180af5811f3cd4d23691542f9be02f6556f4c
    Executing command (/var/jenkins_home/jobs/XXX/jobs/satis-update/workspace): git describe --exact-match --tags
    ...
    

    Additional context

    Before every satis build we execute a composer update inside our satis directory (the one created by composer create-project composer/satis:dev-main --stability=dev --remove-vcs). Today this updated composer:

    Updating dependencies
    Lock file operations: 0 installs, 2 updates, 0 removals
      - Upgrading composer/composer (2.2.10 => 2.3.0)
      - Upgrading composer/pcre (1.0.1 => 3.0.0)
    Writing lock file
    Installing dependencies from lock file (including require-dev)
    Package operations: 0 installs, 2 updates, 0 removals
      - Downloading composer/pcre (3.0.0)
      - Downloading composer/composer (2.3.0)
      - Upgrading composer/pcre (1.0.1 => 3.0.0): Extracting archive
      - Upgrading composer/composer (2.2.10 => 2.3.0): Extracting archive
    Generating autoload files
    

    After that the job failed, as is shown in the outcome section above.

    To make it work again I executed the following in the satis directory:

    composer req -W 'composer/composer:<2.3.0'

    Then the output was again like shown in expected behaviour.

    Reviewed by BSchwetzel at 2022-03-30 14:39
  • 13. No way to respect PHP version requirements when `only-best-candidates` set to `true`

    Is your feature request related to a problem? Please describe. It seems that there is no way to configure satis to build repository working for given PHP version if only-best-candidates is set to true.

    For example if we have an environment running PHP 7.3 and we want to use "friendsofphp/php-cs-fixer": "2.18.1", which is compatible with php: ^5.6 || ^7.0 || ^8.0, setting the flag only-best-candidates to true will cause building a repo with some of the dependencies that are compatible only with PHP 8 (for example "symfony/string": "v6.0.2").

    Then, if we try to use our satis repository in the application, composer will fail with the message: image

    I tried to set desired environment in satis.json file require section, but then building fails with the message: image

    Describe the solution you'd like There should be possibility to define desired platform requirement.

    Describe alternatives you've considered Alternatively, setting the flag only-best-candidates to true should result in including best dependency candidate for each PHP version compatible with packages defined in satis.json

    Reviewed by winiarekk at 2021-12-30 17:05
  • 14. Satis does not mark all abandoned packages as such anymore

    Describe the bug I've got multiple packages in my satis.json that are abandoned ( "abandoned": true in their composer.json). However, Satis does not mark all of them as abandoned on the generated HTML page. In my case only the alphabetically first package is correctly marked as abandoned. All other abandoned packages are shown in blue. The commit which introduced the bug is https://github.com/composer/satis/commit/b432af3aec5a0c073f81125b932b402b06692bd2.

    To Reproduce Add multiple abandoned packages to the satis.json and build it with the current version from main branch.

    Outcome Not all abandoned packages are marked as abandoned.

    Expected behavior All abandoned packages are marked as abandoned.

    Reviewed by halloei at 2021-11-11 21:18
  • 15. Fix errors for phpstan level 6

    Hi, I tried to fix all errors from phpstan on level 6. Not sure if you have a specific wish for the format for iterable types (array<int,string> vs string[]) but for the rest it should be fine.

    Actually, I think I've found a bug on the implementation of strip-hosts, but please double check that part before merging just in case I misunderstood how it's supposed to work.

    It should fix #658

    Reviewed by j3j5 at 2021-10-20 19:36
  • 16. Upgrading from satis 1.0.0 - Shasum mismatch

    Hi,

    We're trying to upgrade satis from 1.0.0 to latest version. To get rid of old junk and get a fresh start we setup a new installation and migrated stuff over.

    We're now stuck with a lot of projects using packages from the old satis, that gets a mismatching shasum when trying to install trough the new installation of satis.

    It's too many projects to go trough and fix this. Is there any way we could upgrade satis without loosing the old shasum, or any other way around this issue?

    Thanks

    Reviewed by kimmenbert at 2021-08-06 07:48
Satis-go is a web server for hosting and managing your Satis Repository for Composer Packages

Satis-go download latest Satis-go is a web server for hosting and managing your Satis Repository for Composer Packages Some Highlights: Satis-go provi

Dec 14, 2021
Merge one or more additional composer.json files at Composer runtime

Composer Merge Plugin Merge multiple composer.json files at Composer runtime. Composer Merge Plugin is intended to allow easier dependency management

May 16, 2022
:musical_note: Provides a composer plugin for normalizing composer.json.
:musical_note: Provides a composer plugin for normalizing composer.json.

composer-normalize Provides a composer plugin for normalizing composer.json. Why When it comes to formatting composer.json, you have the following opt

May 28, 2022
composer parallel install plugin
composer parallel install plugin

prestissimo (composer plugin) This is a composer 1.x plugin that downloads packages in parallel to speed up the installation process. Announcement: Co

May 20, 2022
Check your Composer dependencies at runtime.

Composition Composition provides a lightweight and generic API, that you can use to check your environment at runtime, instead of manually go checking

May 4, 2021
Patch other composer packages on install or update

patch-installer Patch other composer packages on install or update. experimental feature Usage For a patch type change the install path to vendor dire

Apr 11, 2021
Easily parse your project's Composer configuration, and those of its dependencies, at runtime

Composed This library provides a set of utility functions designed to help you parse your project's Composer configuration, and those of its dependenc

Apr 11, 2021
A no-frills PsySH-Composer plugin
A no-frills PsySH-Composer plugin

uma/composer-psysh A no-frills PsySH-Composer plugin. In a nutshell, it provides a composer psy subcommand that spawns a Psy Shell with autoload integ

May 23, 2022
Repman - PHP Repository Manager: packagist proxy and host for private packages

Repman - PHP Repository Manager Repman is a PHP repository manager. Main features: free and open source works as a proxy for packagist.org (speeds up

May 19, 2022
Private, self-hosted Composer/Satis repository with unlimited private and open-source packages and support for Git, Mercurial, and Subversion.
Private, self-hosted Composer/Satis repository with unlimited private and open-source packages and support for Git, Mercurial, and Subversion.

Private, self-hosted Composer/Satis repository with unlimited private and open-source packages and support for Git, Mercurial, and Subversion. HTTP API, HTTPs support, webhook handler, scheduled builds, Slack and HipChat integration.

May 3, 2022
Private Packagist API Client

Private Packagist API Client Table of Contents Private Packagist API Client Table of Contents Requirements Install Basic usage of private-packagist/ap

Mar 16, 2022
Private Composer registry for private PHP packages on AWS Serverless
Private Composer registry for private PHP packages on AWS Serverless

Tug Tug is a Composer private registry for private PHP packages installable with Composer (1 and 2). The main idea of this project is to have an inter

Mar 11, 2022
πŸ“¦βœ‚οΈπŸ“‹πŸ“¦ Create a mirror of packagist.org metadata for use locally with composer
πŸ“¦βœ‚οΈπŸ“‹πŸ“¦ Create a mirror of packagist.org metadata for use locally with composer

?? Packagist Mirror ❀️ Recommended by packagist.org ❀️ Announcement: Composer 2 is now available! This mirror is for Composer 1; Composer 2 is very fa

May 18, 2022
Package Repository Website - try https://packagist.com if you need your own -

Packagist Package Repository Website for Composer, see the about page on packagist.org for more. This project is not meant for re-use. It is open sour

May 15, 2022
Your private self hosted composer repository with user management

Devliver Your private self-hosted composer repository. Requirements Docker MariaDB/MySQL the running docker container has access to private git reposi

Nov 21, 2021
Site-builder is a simple static site generator. It allows you to create and manage a website out of simple text files and templates.

Site-builder is a simple static site generator. It allows you to create and manage a website out of simple text files and templates. This gives you many of the advantages of a CMS, but because the result is plain old HTML, it's more secure and has higher performance.

May 24, 2022
WordPress Packagist β€” manage your plugins with Composer

WordPress Packagist This is the repository for wpackagist.org which allows WordPress plugins and themes to be managed along with other dependencies us

May 25, 2022
This package provides some basic methods to implement a self updating functionality for your Laravel application. Already bundled are some methods to provide a self-update mechanism via Github or some private repository via http.

This package provides some basic methods to implement a self updating functionality for your Laravel 5 application. Already bundled are some methods to provide a self-update mechanism via Github.

May 18, 2022
Packeton - Private PHP package repository for vendors
 Packeton - Private PHP package repository for vendors

Packeton - Private PHP package repository for vendors Fork of Packagist. The Open Source alternative of Private Packagist for vendors, that based on S

May 22, 2022
Sculpin β€” Static Site Generator

Sculpin - PHP Static Site Generator Sculpin takes data sources such as text files (Markdown, Textile, etc.) and transforms them using Twig templates t

May 20, 2022