Composer、Laravel 和本地包

Posted

技术标签:

【中文标题】Composer、Laravel 和本地包【英文标题】:Composer, Laravel and local packages 【发布时间】:2014-04-25 22:13:56 【问题描述】:

我的问题是我有一个不是存储库的包,我正试图让它与 Laravel 和作曲家配合得很好。它仍然位于 vendor 文件夹下,唯一的问题是,如果我简单地设置:

"psr-0": 
        "Test\\Test": "vendor/test/test/src/"
    

这将加载服务提供者,但控制器等都不会自动加载。用没有自己的存储库的 larval 实现包的正确方法是什么。或者这是否违背了包的性质,而这应该只是在应用程序控制器下进行结构化。

这个包是我使用工作台创建的,但我发现我并不真的需要将它作为一个单独的存储库,但将它作为一个包保存仍然很好。因此结构与普通包完全相同:

vendor
    testvendor
        testpackage
            public
            src
            tests
            .gitignore
            composer.json
            phpunit.xml

更新:

作为我目前使用的解决方案:

"autoload": 
    "classmap": [
        "app/commands",
        "app/controllers",
        "app/models",
        "app/database/migrations",
        "app/database/seeds",
        "app/tests/TestCase.php",
        "vendor/package"
    ]
,

作为类映射中的一个条目。展望未来,我可能会将其重构到 app 文件夹或为此包创建存储库。

【问题讨论】:

我们需要更多相关信息。这个包是什么?它只是您复制给供应商的一堆文件,还是存储在您可以下载的服务器中的东西?它有作曲家包结构吗?谁创建了这个包?你能把它做成一个作曲家包并存放在家里吗?你能至少告诉我们这个包的目录结构吗? 为什么vendor文件夹里有非composer包?? 您是否建议将其移至 app/vendor 或类似网站?关于其他事情,我现在将更新问题。 我认为你应该为你的包创建一个 workbench 而不是把它放在vendor 文件夹中。您的自定义包的格式应为workbench 我最初确实有它在工作台下(在开发时),但工作台包不应该在生产环境中使用是我的理解吗?如果我要从中创建一个包,那么是的,我会在开发时将它移到工作台中,如果我在这里遗漏了什么,请告诉我。 【参考方案1】:

如果你有一些你称之为“包”的类,你不应该将这些文件添加到你的供应商文件夹中。此文件夹由作曲家管理,您随时可能会丢失它。在您的应用程序中创建一个子文件夹并将这些文件放在那里。

您必须确保 PSR-0 自动加载功能适用于文件夹结构中的每个文件。所以,如果你的根是 vendor/test/test/src/ 并且你的命名空间是

Test\\Test

你所有的文件都必须在

vendor/test/test/src/Test/Test/ClassFileName.php

PSR-4 更容易处理和理解,这个

"psr-4": 
    "Test\\Test\\": "vendor/test/test/src/"

意味着您的文件必须是这样的:

vendor/test/test/src/ClassFileName.php

仔细检查您的命名空间。使用带有 PSR-0 的命名空间时很容易出错,请记住

composer dump-autoload

每次更改 composer.json 或创建新文件时都必须运行。如果是简单的类自动加载,每次创建文件,如果是 PSR-X 自动加载,每次在 composer.json 文件中创建或更新命名空间。

如果你真的是一个包,你应该使用 Composer:当你的包被构造为一个 composer 包时(以 Laravel 的 composer.json 为例),将它添加到你的应用程序的正确方法,如果不是Packagist 中的列表,通过 repositories.

您可以在公共 VCS 存储库中拥有(非打包师)软件包:


    "require": 
        "monolog/monolog": "dev-bugfix"
    ,

    "repositories": [
        
            "type": "vcs",
            "url": "https://github.com/igorw/monolog"
        
    ]

您可以在受密码保护的 VCS 存储库(git、bitbucket...)中拥有(非打包专家)包:


    "require": 
        "vendor/my-private-repo": "dev-master"
    ,
    "repositories": [
        
            "type": "vcs",
            "url":  "git@bitbucket.org:vendor/my-private-repo.git"
        
    ]

您可以将您的包压缩到您的硬盘驱动器中并通过artifact 存储库类型加载它们:

"repositories": [
    
        "type": "artifact",
        "url": "path/to/directory/with/zips/"
    
],

【讨论】:

感谢您的详细回复。我阅读了文档,问题在于它不是存储库。我目前的解决方案是将供应商/odeon 添加到类映射中,现在一切正常。我不是 100% 这是解决我的问题的正确方法,一切正常。 如果您为同一个包混合了多种自动加载方法,那并不理想。但是,如果您现在只是使用类映射,是的,它会起作用,只是您可能必须在每次创建新类时执行 composer dump-autoload 我会暂时保持这样,但是通过 cmets 我应该将它重构到 app 文件夹中,或者将此包作为存储库。我会接受这个作为解决方案,因为它确实解释了什么是“正确的方法”。【参考方案2】:

虽然@Antonio Carlos Ribeiro 的回答非常好,但我在本地安装自定义包时遇到了问题(在他回答的最后部分也有说明)

假设这是我们尝试安装的包的目录结构:

D:/test_pack
    src/
    composer.json

如果您不想将自定义包(很可能是您自己开发的)上传到在线存储库,您可以使用以下两种方法之一:

方法一

(你必须为你的包指定版本,否则你会得到这个错误:在任何版本中都找不到请求的包,可能包名有错别字。)

1) 在 composer.json 中,将版本添加到您的包中。你的包的 json 应该是这样的:


"name": "gandalf/test_pack",//This is your package's name
"description": "some desc",
"version": "1.0.0",//This is the version that you have to specify
"authors": [
    
        "name": "gandalf the grey",
        "email": "fake@yahoo.com"
    
],
"minimum-stability": "dev",
"require": 
    "laravel/framework": "~5.4"
,
"autoload": 
    "psr-4": 
        "Gandalf\\BotPack\\": "src/"
    
 

2) 压缩你的包(假设压缩文件在 D:/test_pack/test_packa.zip)

3) 在 laravel 的 composer.json 中添加你的包名(在我们的例子中是 gandalf/test_pack 到 json 的 require 部分)并将存储库数组添加到 composer.json 文件中,并在该数组中指定你的包的 zip 所在的目录文件存在(在我们的例子中是 D:/test_pack)。像这样


    ...,
    "require": //adding our package name to laravel's composer.json
        ...,
        "gandalf/test_pack": "*"//package's name
    ,
    ...,

    "repositories": [
        
            "type": "artifact",
            "url": "D:/test_pack"
        
    ]

方法二(我最喜欢的方法,你必须使用git init然后git add .git commit -m "your message"将你的包目录初始化为git本地存储库)

1) 将包目录初始化为 git 目录并将所有更改提交到本地存储库

(假设D:/test_pack 是包含您的包的目录(src/ 目录和composer.json))

转到D:/test_pack 目录并运行这些命令

git init
git add .
git commit -m "your message for this commit"

2) 在你的包composer.json 文件中添加最低稳定性

    
        "name": "gandalf/test_pack",
        "description": "some desc",
        "authors": [
            
                "name": "gandalf the grey",
                "email": "fake@yahoo.com"
            
        ],
        "minimum-stability": "dev",//setting minimum-stability
        "require": 
               //dependencies that your package needs
        ,
        "autoload": 
            "psr-4": 
                "Gandalf\\BotPack\\": "src/"
            
        
    

3)在 laravel 的 composer.json 文件中需要你的包的“dev-master”


    ...,
    "require": 
        ...,//some dependencies that laravel needs
        "gandalf/test_pack": "dev-master"//requiring dev-master from repository
    ,

    "repositories": [
        
            "type": "git",
            "url": "D:/test_pack"//path of the local repository directory which contains your package
        
    ]

【讨论】:

【参考方案3】:

为任何 Laravel 项目加载本地包。它存储在您的机器中。

在laravel的(Project)composer.json文件中添加

  "autoload": 
    "psr-4": 
      "YourPackage\\Namespace\\": "./local_Package_path/src"
    
  ,

并在 Laravel 项目目录中触发命令

composer dump-autoload

可选

如果包在您的项目中仍然不可用。然后 注册您的包裹的服务提供商。

要注册您的服务提供者,您只需在config/app.php 文件中的服务提供者数组中添加一个条目。


'providers' => [

    /*
     * Laravel Framework Service Providers...
     */
    ...

    YourPackage\Namespace\PackageServiceProvider::class,
], 

现在希望你的包成功加载到你的 laravel 项目中。

【讨论】:

以上是关于Composer、Laravel 和本地包的主要内容,如果未能解决你的问题,请参考以下文章

laravel巧用composer

Laravel 安装代码提示扩展

应该如何为 laravel 4 composer 包设置 git 子模块?

Laravel Composer 包雄辩的关系

使用 composer 将非 laravel 包添加到我的 Laravel 项目中

在实时服务器上安装 Laravel 依赖项