作曲家,Laravel和本地包

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

"psr-0": {
        "TestTest": "vendor/test/test/src/"
    }

这将加载服务提供商,但是没有一个控制器会自动加载。 实现一个没有自己的仓库的幼体包的正确方法是什么? 或者这是否违背了软件包的性质,这应该简单地在应用程序控制器下进行构造。

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

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"
    ]
},

作为班级地图中的条目。 展望未来,我可能会将此重构为应用程序文件夹或为此包创建存储库。


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

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

TestTest

你所有的文件都必须在

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

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

"psr-4": {
    "TestTest": "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"
        }
    ]
}

您可以将(非packagist)软件包保存在受密码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/"
    }
],

虽然@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": {
        "GandalfBotPack": "src/"
    }
} }

2)压缩包(假设zip文件位于D:/test_pack/test_packa.zip中)

3)在laravel的composer.json中添加你的包名称(在我们的例子中,gandalf / test_pack需要json的一部分),然后将存储库数组添加到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"
        }
    ]
}

方法II (我最喜欢的方法,你必须使用git init ,然后git add .git commit -m "your message"来初始化你的包目录为git local repository)

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

(假设D:/test_pack是包含你的包的目录( src/ directory和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": {
                "GandalfBotPack": "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
        }
    ]
}
链接地址: http://www.djcxy.com/p/88637.html

上一篇: Composer, Laravel and local packages

下一篇: Laravel module autoload policy confusion