Php 编写器存储库类型取决于环境

Php 编写器存储库类型取决于环境,php,composer-php,Php,Composer Php,我想在composer.json中添加存储库,其中源代码取决于应用程序环境。例如,如果我在本地环境中,我希望包含来自本地文件路径的存储库,如果它在生产环境中,那么我希望包含来自GIT的存储库 在本地: "repositories": [ { "type": "path", "url": "../local-path" }, ] 生产中: "repositories": [ { "type": "vcs",

我想在composer.json中添加存储库,其中源代码取决于应用程序环境。例如,如果我在本地环境中,我希望包含来自本地文件路径的存储库,如果它在生产环境中,那么我希望包含来自GIT的存储库

在本地:

"repositories": [
     {
         "type": "path",
         "url": "../local-path"
     },
 ]
生产中:

"repositories": [
     {
         "type": "vcs",
         "url": "https://github.com/...."
     },
 ]

在my.env文件中有一个APP_env变量。有没有可能实现这一点?

我认为这不是一个好主意,因为您有可能从错误的环境提交
composer.lock
文件并进行部署。不过,希望您有更严格的部署检查

我没有确切的解决方案,但有一些选择:

在本地使用Composer配置文件
  • 不需要单独的编写器文件
  • 可能会对版本很挑剔(我以前在让composer访问symlink时遇到过麻烦)
  • 应该只允许您维护一个
    composer.json
    ,并且在添加新的本地repo时只触摸配置文件

在本例中,我使用一个简单的
composer.json
创建了一个项目

{
    "name": "mickadoo/test",
    "type": "project",
    "require": {
        "mickadoo/basedata": "dev-master"
    }
}
我添加了一个单独的需求,这是我几年前自己放在PackageGist上的一个包

然后我创建了一个虚拟库,用相同的名称在本地测试它。它位于一个
目录中,其中只包含一个
composer.json
文件。目标是检查composer是否将安装此空库(无要求)而不是联机库

{
    "name": "mickadoo/basedata",
    "type": "library",
    "require": {}
}
然后,我向项目根目录添加了一个
config.json
文件,配置告诉composer向上添加一个本地repo one目录:

{
  "repositories": [
    {
      "type": "path",
      "url": "../library"
    }
  ]
}
在所有这些之后,我首先尝试运行
composer update
并将
composer\u HOME
env变量设置到我的当前目录。这确保composer将拾取
config.json
,并将其合并到所使用的配置中

$ COMPOSER_HOME=$PWD composer update
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
  - Installing mickadoo/basedata (dev-master): Symlinking from ../library
Writing lock file
Generating autoload files
然后,我删除了我所做的一切,因为我以前在composer中弄乱了本地路径,并且知道开始工作可能会令人沮丧:

$ rm -rf vendor/ && rm composer.lock 
最后,我试着正常运行
composer update
,希望它跳过
config.json
,从Github中取出包

$ composer update
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 14 installs, 0 updates, 0 removals
  - Installing symfony/polyfill-apcu (v1.13.1): Downloading (100%)         
  - Installing psr/log (1.1.2): Downloading (100%)         
... more package installs from Github here....
Writing lock file
Generating autoload files
的确如此

使用单独的
composer.json
  • 保持事物清晰可见
  • 分离
    composer.lock
    文件


这意味着要维护两个单独的文件,如
composer.local.json
composer.json
。这可能很乏味,但至少清楚发生了什么。根据您的
COMPOSER
env变量,您可以更改它使用的文件名

我在这里看到了几个选项

  • 使用存储库的本地路径。然后在dev env checkout上执行与生产环境不同的检查。但这需要保持本地存储库与远程存储库同步
  • 定义存储库的dist和source,然后在运行composer命令时对其进行区分(prod上的
    --首选dist
    ,dev上的
    --首选source
  • 构建你自己的插件,在某些事件发生之前就可以启动
  • 另一个选项是将
    composer.json
    文件用于生产,将
    composer-dev.json
    用于开发,并首先设置系统环境变量来运行第二个:

    COMPOSER=COMPOSER-dev.json php COMPOSER安装

    但这可能会产生一些不兼容问题(当您忘记将包从
    composer-dev.json
    移动到生产
    composer.json
    时)

  • {
        "name": "mickadoo/test",
        "type": "project",
        "require": {
            "mickadoo/basedata": "dev-master"
        }
    }
    

    你到底为什么要这样做?听起来你会遇到很多麻烦。一旦git上的存储库从本地版本转移,你的开发环境和产品就会运行不同的代码库,这可能会导致本地环境在生产中断时工作。我的建议是不是解决这个问题,而是找到一条通往真正目标的更好的道路。真正的目标是什么?反对在任何地方使用github版本的理由是什么?