【问题标题】:Composer and local dependenciesComposer 和本地依赖项
【发布时间】:2021-10-10 21:04:25
【问题描述】:

我想使用 Composer 来管理我自己在工作中使用的私有库,并将它们用于工作中的 Intranet 项目。

根据公司规则将代码发布到 packagist 或 github;可以这么说,所有代码都将保留在我们自己的围墙内。

我已经弄清楚如何将库单独包含到我的 Intranet Web 应用程序中:

网页应用的composer.json

{
    "name": "myapp/appname",
    "description": "app that uses some of my libraries",
    "require": {
      "tmorton/dataaccessobjects": "^1.0.0"
    },
    "repositories": [
      {
        "type":"vcs",
        "url":"//path/to/library"
      }

    ]
}

我的问题是这个数据访问对象的集合依赖于我的 crud 库。

所以看来我应该可以requiredataaccessobjects库中composer.json中的crud库了:

composer.json 用于数据访问对象

{
    "name": "tmorton/dataaccessobjects",
    "description": "Data Access Objects for a set of specific tables",
    "type": "library",
    "license": "proprietary",
    "repositories": [
      {
        "type": "path",
        "url":"//path/to/crud/library"
      }
    ],
    "minimum-stability": "dev",
    "require": {
      "tmorton/crud": "^2.0.0"
    }
}

我的 DAO 对象被克隆到 app/vendor 中,但 Crud 没有被引入。

我看到的所有文档都谈到了发布到第三方位置,但没有提到来自本地来源。

我当然可以这样做;但它破坏了管理依赖项的整个想法(我不应该知道此时需要哪个版本的 crud)

网页应用的composer.json

{
    "name": "myapp/appname",
    "description": "app that uses some of my libraries",
    "require": {
      "tmorton/dataaccessobjects": "^1.0.0",
      "tmorton/crud": "^2.0.0"
    },
    "repositories": [
      {
        "type":"vcs",
        "url":"//path/to/dao/library"
      },
      {
        "type": "path",
        "url":"//path/to/crud/library"
      }

    ]
}

我希望有人能补充一些我似乎遗漏的概念。


suggested question 的答案似乎表明type: "package" 不起作用。我没有使用type: "package"

包类型用于非作曲家依赖。如果使用这种类型,Composer 甚至不会在已定义的包源中查找 composer.json 文件,您需要在项目 composer.json 中的包声明中包含有关包的所有必需信息

我收集到的是,无论您做什么,作曲家 - 本身 - 都不会费心查找包含项目的依赖关系。在抓取 3rd 方的东西时它会以某种方式起作用,但显然还有其他东西在做这项工作。我猜是主机本身?

【问题讨论】:

标签: composer-php


【解决方案1】:

我发现运行 Intranet 会带来一些管理开销,这也是我停止使用它的原因。

在您的情况下,我会建议:

  1. 使用 git 进行内部包:
    您在某处有一个私人 git 存储库,并要求使用 repository directive of composer

    “要求”:{
    “我的/包”:“开发主”
    ...
    },
    “存储库”:[
    {
    “类型”:“git”,
    "url": "git@bitbucket.org:my/package.git"
    }
    ]

当然不要提交供应商目录,但要提交 composer.lock。

更新:
请注意,您还需要在项目的 composer.json 的存储库块中添加私有子包的存储库。 因此,当 my/package 需要另一个私有包 my/package2 时,请将 thismy/package2 也添加到您的项目 composer.json 的 repositories 块中。

  1. 使用构建进行部署
    使用 deployer 之类的工具,您可以轻松地在生产环境中运行 composer,并在所有运行后符号链接到成功的构建/发布。
    在这里,您还依赖于生产机器上的 composer,但部署程序通常在 web 根目录之外安装 phar 本身。
    如果这不合适,您还可以使用 deployer 进行本地构建并通过 rsync 同步到您的生产系统: https://deployer.org/docs/advanced/deploy-strategies.html#build-server
    在这里,您在构建目录中从 git 本地签出,在本地运行 composer 并通过 rsync 推送到生产环境。

【讨论】:

  • 关于部署——在我接受了必须在生产环境中运行 composer 的想法后,我意识到我的 post-receive 钩子不仅可以设置 git 树,还可以运行 composer。 (duh!)因此,添加一行后,部署就像冠军一样工作 :) 这留下了依赖问题:
  • 我正在为我的每个包使用 git repos。我尝试在它们上运行 composer 以引入依赖项,但当然它们进入了包的 vendor 目录,当我在项目中使用它们时会一团糟。但是你是说如果每个包都建了锁文件(忽略vendor),项目会拉那些依赖?
  • 否,在使用包的项目中提交锁文件。不要在包中提交锁定文件。
  • 抱歉,我仍然与您试图传达给我的内容有些脱节。我可以通过存储库将包引入我的项目;问题是如果一个包有依赖项,它就不包括在内。现在...我可以从每个包中获取作曲家锁以构建需求列表并将它们全部手动粘贴到项目的作曲家锁中...但感觉这会要求麻烦。这是你的建议吗?
  • 如果您愿意引用项目只需要要求命名其依赖项的包,我会接受您的回答,但项目必须命名依赖项使用的所有存储库。谢谢你给了我希望,这真的是可能的!
猜你喜欢
  • 2018-02-02
  • 2015-05-29
  • 2015-01-24
  • 2019-12-31
  • 2023-03-12
  • 1970-01-01
  • 2021-09-26
  • 1970-01-01
  • 2012-04-21
相关资源
最近更新 更多