【问题标题】:How to develop and include a Composer package?如何开发和包含 Composer 包?
【发布时间】:2012-12-27 01:29:14
【问题描述】:

我希望用 PHP 开发一个包,但我不希望它立即在 GitHub 或其他地方可用。在我的composer.json 中包含一个Packagist 文件很容易,但是如何将本地包添加到我的composer.json 中?另外,我应该在/vendor/foo/bar(相对于根composer.json)中构建包,还是应该把它放在其他地方?

编辑:我想我的问题是关于其他人如何编写他们的包。是否每个新包都被添加到 Packagist,然后当你想测试你的更改时,你提交到 GitHub(或任何地方),然后通过 Composer 将其拉回?这看起来效率很低。

【问题讨论】:

    标签: php composer-php


    【解决方案1】:

    也许添加自定义存储库会对您有所帮助?

    https://github.com/composer/composer/blob/master/doc/05-repositories.md

    您可以非常轻松地使用您的库设置本地 git 存储库。

    当然,如果您使用 composer 来管理依赖项,您应该在其他地方构建您的库并通过 composer 将其下载到供应商/因为这是我猜的重点。

    【讨论】:

    • 所以在开发过程中,每次对包进行微小更改时都必须执行composer update 以使开发项目引入最新版本?有没有更快的方法?
    • 我也有同样的情况。我不知道如何在本地开发作曲家包,而无需在每次进行更改时将其上传到某处或运行作曲家命令。
    • 这个技巧只是为了从你的库中开发一个作曲家包。为什么要使用composer来开发库本身?我想你可以问另一个问题,因为我不再使用作曲家了,这已经快 2 岁了。欢呼
    • @fsw,例如,因为您的 Composer 包是 Composer 插件。
    【解决方案2】:

    由于这个问题有许多不同的组件/标准需要解释,我会在这里尽可能多地解释,你可以私信我或者只是谷歌它来寻找更具体的问题。

    回答您的第一个问题,“如何将本地包添加到我的composer.json?”:

    如果“添加本地包”是指自动加载您的类/包,您可以通过使用 PSR-4 或 PSR-0 或 Composer 中的 Classmap 选项来实现。

    阅读全文

    如果您需要有关 PSR-0、PSR-4 和 Classmap 的更多信息,可以 Google 一下。

    示例

    "autoload": {
       "psr-4": { "Core\\": "src/Core" }  ## "standard": { "namespace" : "path/to/dir"}
    }
    

    或(编辑)

    如果你真的想添加本地包:

    1. 为本地包创建一个composer.json,例如:

      {
         "name": "localPackage/core",
         "version": "dev-master"
      }
      

      您还可以根据需要指定其他属性和/或依赖项。

    2. 压缩包,将composer.json文件作为archive.zip中的根文件,并将其放在需要的位置。

    3. 在要包含本地包的其他项目/包中,将本地包名称添加到所需参数中,如

      "localPackage/core": "dev-master"
      

      repositories参数下添加以下内容:

      "repositories" : [
          {
              "type": "artifact",
              "url": "path/to/localPackage.zip"
          }
      ]
      

    现在如果你在 git 上有本地包,那么就不需要存档包(基本上省略第 2 步),你只需要将上面示例中的 URL 替换为 path/to/localPackage/.git

    (编辑结束)


    现在回答更大的问题:“我如何开发和包含 Composer 包?”:

    1. 决定目录结构。一般如下:

      /PackageRoot
          /src/PackageCore
          composer.json   ## this is your library’s composer.json
          LICENSE
      

      并设置您的composer.json

      我的一个composer.json 文件的示例可以在http://pastebin.com/tyHT01Xg 找到。

    2. 上传到Githubtag the version。使用Semantic versioning(确保在上传到Github时排除/忽略vendor目录)。

    3. Packagist注册包(登录后)。

      如果您已将提交标记为 v1.0.0(或类似名称),那么这将显示在该包的 Packagist 仪表板中。

    现在,如果一切正常,您应该能够通过将您的库添加到该项目的 composer.json 来将其用作其他项目的依赖项。

    【讨论】:

    • 但是如何开发一个作曲家包而不需要发布呢?原因是我不想发布我的包,因为它基本上还没有完成,但我仍然想定义我的 composer.json 文件和它的依赖关系而不需要实际需要提交 和/或 publish 它已经在某个地方。我希望能够修改我的代码,直到它okay,并且当它准备好时我想发布它。示例:我有一个项目 A,对于这个项目,我在我的新包 B 上定义了一个 require 依赖项,它只存在于我的机器上。如何在不发布的情况下在 A 中测试 B?
    • 就像我说的 Packagist 和 Git 的作曲家作品。如果你的包裹还没准备好也没关系。只需在 git 上将其标记为 alpha/beta 即可。
    • 基本上你不能要求不在 Packagist 或 github 上的包。甚至我的应用程序还没有准备好,但在 github/packagist 上并标记为 v1.x.x-alpha,如果您愿意,请查看 - github.com/shalomsam/Core
    • @shalomsam 您可以很好地要求不在 Packagist 或 github 上的软件包 - 请参阅自定义存储库 - 链接其他答案已发布
    • @Lukx - 是的,我的立场是正确的。但我仍然猜你不能用它来加载本地包,或者你可以吗?
    【解决方案3】:

    为了提高开发效率,我只需将开发存储库符号链接到已经安装它的目录中。

    例如,如果/Code/project-1 需要/Code/package-1 中的包,我:

    1. package-1 提交到 GitHub(甚至可以是私有的)。
    2. 然后我告诉project-1 使用自定义存储库安装它(有关存储库配置的链接,请参见其他答案)。
    3. 安装后,我将/Code/project-1/vendor/developer/package-1 符号链接到/Code/package-1

    这样,当我在/Code/package-1 中进行更改时,它会立即反映在/Code/project-1 中。

    【讨论】:

      【解决方案4】:

      这里是解决方案的概述以及我自己的解决方案

      1. 在包装师上发布

      由于您还不想发布,您正在开发中,这是一个糟糕的选择。

      1. 上传github

      您可能不想在 github 上发布您的库源代码,不想为私人仓库付费,或者无法使用云外部服务(由于政治或网络政策)。

      1. 压缩你的库

      您可以在示例实现中使用 composer 存储库路径来指向本地 zip 文件作为发行版。每次对库进行更改时都必须重新压缩,即使使用批处理文件来完成,这也很糟糕。

      1. 上传到您机器上的本地 git/svn 存储库

      这已接近尾声,但每次更改库并想要测试示例实现时,都需要更新作曲家。这模仿了制作,但很麻烦。我个人推荐这个解决方案,即使它不是无脑的。

      1. 直接自动加载库(你想要什么)

      这是一个 hack,但您可以添加:

      {    
        "require": {
        },
        "autoload": {
          "psr-4": { 
            "yourlibnamespace": "D:\\Code\\yourlib\\src\\" 
          }
        }
      

      }

      请注意,您需要将“require”部分从您的库中复制并粘贴到您的示例实现中。将“yourlibnamespace”更改为您的库名称空间,将“D:\Code\yourlib\src\”更改为您的库源的本地路径。

      这样任何更改都会立即反映出来。但是,您根本不会使用或测试库的 composer.json 文件。如果您更改库 .json 中的要求,它根本不会通过。所以它有一些很大的缺点,但确实可以做你想做的事,那就是用尽可能少的命令立即测试你的库实现。

      1. 直接在库树中添加示例实现(推荐)

      通常您只有 src\ 和 tests\,但很多都有示例\,您可以在其中找到示例实现。在开发应用程序时,您可以为这些示例实现做出贡献。您可以在本地 git/svn 存储库中执行此操作,并且您具有获取 lib 的“要求”以及自动命名空间的优势。这是世界上最好的。我推荐这种方法。

      【讨论】:

      • 非常具有误导性。问题是关于上传前的开发。 #5 是正确答案,而不是 hack。
      • 你错了。问题是“如何在我在 packagist 上发布之前在本地开发一个新的作曲家包”而不是“我如何在我的项目中使用作曲家包”。您在对我投反对票后发布的答案(并使其无法评论您的答案)错误地回答了第二个问题,而不是该问题的主题。我的回答中的所有 6 种方法都是正确的(直接回答 3-6 个),它们都有不同的缺点。我建议#6。
      【解决方案5】:

      似乎这个线程上的大多数答案都不是“知道的”。我自己是 Composer 的新手,但这些答案具有误导性。这个问题可以简单地表述为:“我怎样才能开发一个作曲家包”。

      是的,您可以使用自定义存储库或上传未完成的包并在每次更改后更新它。这既不是正确的解决方案,也不是问题的答案。

      Composer's official documentation 没有提前说明这一点并没有帮助,但你可以看到Libraries documentation page 上的标题:

      每个项目都是一个包

      理解这一点非常重要

      composer.json:

      前面提到的页面继续说明:

      为了使该软件包可安装,您需要为其命名。为此,您可以在 composer.json 中添加 name 属性

      {
          "name": "acme/hello-world",
          "require": {
              "monolog/monolog": "1.0.*"
          }
      }
      

      到目前为止,在此示例中,我们有一个必需的包,现在还有一个名称。注意 vendor/name 格式。

      现在自动加载我们自己的文件,这些文件记录在 Basic usage 页面上。

      {
          "autoload": {
              "psr-4": {"Acme\\": "src/"}
          }
      }
      

      这将自动加载src/Acme 目录下的命名空间类文件。

      尽情享受吧。

      安装/更新

      使用命令安装或更新包:

      composer update
      

      php composer.phar update
      

      这将下载所需的包并创建 autoload.php 文件

      我们的项目结构应该类似于以下内容:

      src
          Acme
              Foo.php
      vendor
          monolog
              ...
      composer.json
      

      包括

      现在开始测试。

      包括 autoload.php

      require_once 'path/to/project/vendor/autoload.php';

      假设 Foo.php 如下所示:

      <?php
      
      namespace Acme;
      
      class Foo {
          public static function bar(){
              return 'baz';
          }
      }
      
      ?>
      

      然后我们可以从我们的脚本中调用它:

      echo Acme\Foo::bar(); // baz
      

      请更正我可能陈述的任何误导性信息。这似乎是一个热门问题的解决方案。

      【讨论】:

      • 正如对原始问题的编辑所提到的,每次您对子包进行一些更改时,都必须在父项目上提交、推送然后运行更新,这是非常低效的。我不确定这个答案是否解决了这个问题。
      【解决方案6】:

      这是我在本地创建和开发新 Composer 包的流程:

      1. 在 GitHub 上为包创建一个新的存储库(只是一个示例)
      2. 将其添加到 Composer 的数据库 (packagist.org)
      3. 通过 composer require 将其添加到您的主项目中。这就是您开始思考如何快速应用修补程序的地方
      4. 将其克隆到本地计算机上的某个位置,这是您开发它的地方
      5. 现在要测试您的本地版本,添加一个 php require() 语句来加载相关类文件。自动加载器不会加载通过作曲家下载的,而是您本地的。
      6. 完成修补程序后,删除/注释掉 require 语句以恢复使用包的 composer 版本。
      7. 提交所有更改,标记提交并推送到 GitHub; hook 触发更新 Composer。在你的主项目上运行 composer update,包会更新到你的本地版本。

      这仍然不理想,但它可以完成中小型封装的工作。

      【讨论】:

        【解决方案7】:

        您可以告诉 composer 使用任何本地路径,而不是创建新的存储库:

        https://getcomposer.org/doc/05-repositories.md#path

        例如,假设您的 PHP 项目位于 ~/devel/projects

        你的主项目可能在~/devel/projects/main_project,你的“本地包”在~/devel/projects/local_package

        为本地包定义您的作曲家配置。在~/devel/projects/local_package/composer.json.

        {
            "name": "your_vendor_id/your_local_package",
            ...
        }
        

        然后,您可以编辑 ~/devel/projects/main_project/composer.json 并通过路径 repo 链接到您的本地包:

        "repositories": [
            {
                "type": "path",
                "url": "../local_package",
                "options": {
                    "symlink": true
                }
            }
        ],
        "require": {
            "your_vendor_id/your_local_package": "dev-master",
            ...
        }
        

        有关此链接的更多信息(不是我写的,但对此主题有很好的解释):

        https://carlosbuenosvinos.com/working-at-the-same-time-in-a-project-and-its-dependencies-composer-and-path-type-repository/

        【讨论】:

          【解决方案8】:

          我的工作流程并未完全回答 OP 的问题,但可能对其他人有所帮助。

          1. 我喜欢在现实世界的项目中开发可重用的包/库,我不想在本地通过 git/composer。
          2. 与生产环境相比,我也不喜欢以不同的方式在本地加载包(例如,通过本地 require 语句或本地 composer 设置)。

          所以我做的很简单:我直接在供应商目录下添加包,直接或使用符号链接。

          缺点

          1. 使用 composer update / install 时,您的包可能会被覆盖。 (因此我倾向于在此期间一一更新或添加依赖项)。
          2. 如果不小心,生产环境中的 composer install 可能会安装不同的版本。所以继续推送你的包和版本标签!!
          3. 通过 composer update 更改包的依赖项并将其加载到父项目中,会覆盖包的文件夹

          【讨论】:

            猜你喜欢
            • 2021-10-03
            • 2019-07-28
            • 2016-09-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-06-25
            • 2016-10-23
            • 1970-01-01
            相关资源
            最近更新 更多