【问题标题】:Symfony 2 bundle with its own composer.jsonSymfony 2 捆绑了自己的 composer.json
【发布时间】:2018-02-14 16:18:02
【问题描述】:

我正在创建一个新的 Symfony 2 捆绑包,我的目标是开源。它住在/src/crmpicco/ChargebeeBundle

在那个目录中我有一个composer.json,它看起来像这样:

{
  "name": "crmpicco/ChargebeeBundle",
  "type": "library",
  "description": "A Symfony 2 bundle which provides an easy way to handle billing and subscriptions.",
  "keywords": [
    "crmpicco",
    "Chargebee",
    "Symfony",
    "Subscription"
  ],
  "license": "MIT",
  "authors": [
    {
      "name": "CRMPicco",
      "email": "picco@crmpicco.co.uk",
      "homepage": "http://www.crmpicco.co.uk",
      "role": "Analyst Developer"
    }
  ],
  "require": {
    "chargebee/chargebee-php": "^2.0"
  },
  "autoload": {
    "psr-0": {
      "": "src/",
      "SymfonyStandard": "app/"
    },
    "classmap": [ "app/AppKernel.php", "app/AppCache.php" ]
  },
  "extra": {
    "symfony-app-dir": "app",
    "symfony-web-dir": "web",
    "symfony-assets-install": "relative"
  }
}

bundle 需要的依赖是 chargebee/chargebee-php,但是当我从 Symfony 项目的主目录中执行 composer installcomposer update --prefer-dist 时,它无法识别这个 composer.json 或尝试删除该依赖。

我的 composer.json 是否在正确的位置,我的文件结构是否正确设置?

【问题讨论】:

  • 可能不是您的问题的一部分,但extra 部分和app/classmap 的自动加载器可能不属于您的包,因为它们是在实际应用程序的作曲家中定义的.json。除此之外,您能否列出您为将此捆绑包添加到项目中所做的步骤?你的包不在 packagist 上,所以我假设你必须修改项目的 composer.json 以使其可访问?
  • 该捆绑包目前仅存在于我们内部的私有仓库中。所以我把它放在我的 FS 上,符号链接到我的 SF 项目中的正确位置(例如/src/crmpicco/ChargebeeBundle)。我现在不希望它出现在 Packagist 上,因为它是 WIP。
  • 没关系,但你是如何符号链接它的?你是手动做的还是add the path to repositories in your project's composer.son?如果你只是符号链接它,composer 不会拉入包,因此不会解析你的包的 composer.json。你基本上绕过作曲家,这就是我问的原因。
  • @dbrumann 我在 CLI 上对它进行了符号链接,如果这就是你的意思,则不使用作曲家。即ln -s。感谢您的链接。你知道"require": { "my/package": "*" } 指的是什么吗?考虑到我的包裹在 Packagist 上不可用,这对我有效吗?
  • 在您的情况下,您想使用 composer.json 中定义的名称,所以crmpicco/ChargebeeBundle。您还可以使用标志 -v 运行 composer 以获得更详细的输出。这将有助于查看 composer 是否可以在其中找到目录和包。

标签: php symfony symfony-2.8 composer-php


【解决方案1】:

src 中代码的依赖关系在项目的根 composer.json 中定义。 /src/crmpicco/ChargebeeBundle 中的那个会被忽略。

如果您想将以前的私有代码作为共享包发布,您可以执行以下操作:

首先,阅读official best practices for reusable bundles。这将有助于以允许其他开发人员使用它的方式构建您的项目。

然后,清理composer.json。尽管您发布的内容包含了很多需要的内容,但它也有一些不需要的值,例如classmapextra 这里不需要。您可能想试试这个(随意添加作者、关键字等):

{
    "name": "crmpicco/ChargebeeBundle",
    "type": "symfony-bundle",
    "require": {
        "chargebee/chargebee-php": "^2.0"
    },
    "autoload": {
        "psr-4": {
            "Crmpicco\\ChargebeeBundle\\": ""
        }
    },
    "license": "MIT"
}

然后,您必须决定是从私人仓库还是从 Github 之类的东西提供捆绑包,并希望它在 Packagist 中注册。

如果您想在私有仓库中使用它,您必须编辑您的全局 composer.json 并添加以下部分:

"repositories": [
    {
        "type": "vcs",
        "url": "ssh://git@yourgitserver.example.com/path.to.repo.git" 
    }
]

如果您想将其设为官方Packagist 包,请在此处注册一个帐户并按照说明添加您的包。 (别忘了设置更新挂钩。)

在这两种情况下,您现在都必须将包名称添加到根 composer.jsonrequire 部分。只要你没有在你的包中标记发布,你必须添加dev-master作为所需版本,并将"minimum-stability" : "dev"行添加到根composer.json

现在,从 /src/crmpicco/ChargebeeBundle 中删除代码(或将其移出 Symfony 项目)并运行 composer update --prefer-source。您现在应该可以找到安装在 vendor 下的包。

您可能还意识到 Composer 将您所有的 Symfony 包更新到某个 x.x-dev 版本,这是由于“最低稳定性”设置。随它去;您可以在第一次成功运行后删除“最小稳定性”行,然后再次删除composer update。然后它会再次降级 Symfony 开发包,但不要管你的包。这是一种非常古怪的方法,但我还没有找到更好的方法。 (也许其他人知道更好的方法来处理这个问题。)

如果您在安装时遇到问题,请仔细阅读 Composer 的输出并按照说明进行操作。例如,您可能在包的 composer.jsonrequire 行中的包名称不匹配。或者 Composer 可能会抱怨无法解决的依赖关系,您需要修复它。

祝你好运!您可能仍会遇到其他问题,但我建议您将它们作为单独的 SO 问题发布——除非它们是微不足道的,在这种情况下,欢迎您将它们作为 cmets 发布,我会尝试回答它们和/或相应地更新这篇文章。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-09
    • 1970-01-01
    • 2012-08-21
    • 2012-07-05
    相关资源
    最近更新 更多