phpsymfonycomposer-phpsymfony-flex

On my private Symfony Flex recipe, files are not copied from the recipe when installing the bundle


I'm currently in the process of releasing a Symfony bundle for a very small amount of people. This is the reason why I don't think will one day land on https://github.com/symfony/recipes-contrib, so I used the Flex Private Recipe documentation.

I pushed the bundle on GitHub and created another one to store its recipe.

This is my recipe:

{
  "manifests": {
    "edumedia/gar-api-bundle": {
      "manifest": {
        "bundles": {
          "eduMedia\\GarApiBundle\\eduMediaGarApiBundle": [
            "all"
          ]
        },
        "copy-from-recipe": {
          "config/": "%CONFIG_DIR%"
        },
        "env": {
          "GAR_DISTRIBUTOR_ID": "000000000_0000000000000000",
          "GAR_SSL_CERT": "/path/to/cert.pem",
          "GAR_SSL_KEY": "/path/to/cert.key"
        }
      },
      "ref": "ad610a54abdf2f5563841a4ce4b3c3cb29a7d0ff"
    }
  }
}

At the same level, there is a config directory that holds a configuration file:

# config/edumedia_gar_api.yaml
edumedia_gar_api:
  distributor_id: '%env(GAR_DISTRIBUTOR_ID)%'
  ssl_cert: '%env(GAR_SSL_CERT)%'
  ssl_key: '%env(GAR_SSL_KEY)%'
  remote_env: 'preprod'
  cache_directory: '%kernel.cache_dir%/gar-cache'

However, nothing is copied when executing the recipe.


Solution

  • On private recipes, files are not copied from the directory, but from the "recipe" itself.

    The directory structure works when submitting a Flex recipe to the Symfony repository, but when creating a private recipe, the file's contents need to be inlined within the recipe's JSON.

    E.g.:

    {
      "manifests": {
        "edumedia/gar-api-bundle": {
          "manifest": {
            "bundles": {
              "eduMedia\\GarApiBundle\\eduMediaGarApiBundle": [
                "all"
              ]
            },
            "copy-from-recipe": {
              "config/": "%CONFIG_DIR%"
            },
            "env": {
              "GAR_DISTRIBUTOR_ID": "000000000_0000000000000000",
              "GAR_SSL_CERT": "/path/to/cert.pem",
              "GAR_SSL_KEY": "/path/to/cert.key"
            }
          },
          "files": {
                    "config/packages/edumedia_gar_api.yaml": {
                        "contents": [
                            "edumedia_gar_api:",
                            "  distributor_id: '%env(GAR_DISTRIBUTOR_ID)%'",
                            "  ssl_cert: '%env(GAR_SSL_CERT)%'",
                            "  ssl_key: '%env(GAR_SSL_KEY)%'",
                            "  cache_directory: '%kernel.cache_dir%/gar-cache'",
                            "  remote_env: 'preprod'"
                        ],
                        "executable": false
                    }
                },
          "ref": "ad610a54abdf2f5563841a4ce4b3c3cb29a7d0ff"
        }
      }
    }
    

    Creating this file by hand can be quite a chore. So it's usually better to create the recipe as if it was going to be a public recipe, with the complete directory structure (including a directory for vendor, package name, and version number), and use Symfony's tool to generate the finished recipe.

    I describe that process on this other answer.