【问题标题】:Component-based development with composer使用 composer 进行基于组件的开发
【发布时间】:2014-01-18 04:00:29
【问题描述】:

假设我想编写一个新应用程序。

/workspace/exampleapp/
  .git
  src/
  vendor/
    app/
      component1/
        .git
        src/
        composer.json
      component2/
        .git
        src/
        composer.json
  composer.json

我有三个 git 存储库。他们没有遥控器。我还有三个composer.json 文件。

/workspace/app/composer.json

{
  "name": "app/app",
  "type": "project",
  "license": "MIT",
  "require": {
    "app/component1": "dev-master",
    "app/component2": "dev-master"
  },
  "autoload": {
    "psr-4": {"app\\": "src/"}
  }
}

/workspace/app/vendor/app/component1/composer.json

{
  "name": "app/component1",
  "type": "library",
  "license": "MIT",
  "autoload": {
    "psr-4": {"app\\": "src/"}
  }
}

/workspace/app/vendor/app/component2/composer.json

{
  "name": "app/component2",
  "type": "library",
  "license": "MIT",
  "autoload": {
    "psr-4": {"app\\": "src/"}
  }
}

如果我在项目根目录中运行composer update,我会收到错误在任何版本中都找不到请求的包app/component1,可能是包名中的拼写错误。

我必须进行哪些更改才能使其正常工作?有没有办法不将组件目录移出vendor 目录或创建远程存储库?

谢谢!

【问题讨论】:

    标签: php composer-php


    【解决方案1】:

    我认为您正在遭受the XY problem 的困扰 - 我将假装您实际上问过“如何使用 Composer 设置具有以下要求的项目?”

    • 能够在没有远程 Git 服务器的情况下工作,即能够在本地提交和推送。
    • 能够将组件的代码分别提交到主项目的提交中。
    • 能够为您的存储库编辑供应商目录中的代码,并从这些目录提交。

    在这种情况下,答案是这样设置你的目录:

    /workspace/app/
      composer.json
        src/
    
    /workspace/components/
      component1/
        composer.json
        src/
      component2/
        src/
        composer.json
    

    像这样设置每个组件的 composer 文件:

    /workspace/components/component1/composer.json

    {
      "name": "app/component1",
      "type": "library",
      "license": "MIT",
      "autoload": {
        "psr-4": {"app\\": "src/"}
      }
    }
    

    告诉您应用程序的 composer.json 文件将组件目录用作本地 git 存储库。

    /workspace/app/composer.json

    {
      "name": "app/app",
      "type": "project",
      "license": "MIT",
      "require": {
        "app/component1": "dev-master",
        "app/component2": "dev-master"
      },
      "autoload": {
        "psr-4": {"app\\": "src/"}
      },
      "repositories": [
        {
            "type": "vcs",
            "url": "/workspace/components/component1"
        },
        {
            "type": "vcs",
            "url": "/workspace/components/component2"
        }
      ],
    }
    

    当您进行第一次“作曲家更新”时,您应该使用选项composer update --prefer-source 运行它。这将迫使 composer 为代码做一个 git clone,而不是只下载一个 zip-ball 并解压缩它。

    (可能不需要添加--prefer-source,似乎composer在从本地目录存储库获取时默认会克隆)。

    您现在可以在供应商目录中编辑组件的代码,可以将其单独提交到应用程序代码,还可以将其推送到位于/workspace/components/component1/ 的“远程”git 存储库。

    【讨论】:

    • 感谢您的回答!我不太喜欢这个选项,因为我必须将路径硬编码到我的composer.json 中。你知道是否有办法让它与相对路径一起工作?我还没有成功(file:// 似乎也不起作用)。
    • 看来不是 - github.com/composer/composer/issues/2171。老实说,将存储库的东西放在 composer.json 中并不是一个好主意。如果您想那样工作,最好使用我的其他答案中的 hack:stackoverflow.com/questions/18100420/…
    猜你喜欢
    • 2011-01-09
    • 2014-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-25
    • 2013-03-01
    • 1970-01-01
    • 2012-01-02
    • 2015-01-03
    相关资源
    最近更新 更多