我刚开始使用Composer。我想确保我正确理解Composer在使用Composer的默认设置从Packagist 下载和安装软件包时所做的工作。这是对的:
composer.json
文件的“要求”部分指定将从Packagist下载并安装的软件包。 只有“要求”部分中列出的软件包才会出现已下载并安装。 autoload_namespaces.php
文件夹(在下载和安装期间在项目的根目录中创建)中创建vendor
文件。此文件包含每个下载和安装的包的名称空间定义,该包映射到文件系统上的文件夹autoload_namespaces.php's
命名空间访问。如果每个下载的文件都包含与autoload_namespaces.php's
个名称之一匹配的NAMESPACE定义。 如果下载的文件中没有名称空间定义,则文件中的类将分配给GLOBAL名称空间。 autoload_namespaces.php
文件 中定义为 ,并且不受任何影响composer.json
的“自动加载器”部分的方式,假设在autoload_namespaces.php
“自动加载器”部分中composer.json
文件中没有重复出现的NAMESPACE。我对上述项目的理解是否正确?如果没有,请你纠正我?
提前致谢 -
答案 0 :(得分:1)
你有些不对劲。
ad 1。:
除非您在安装或更新时使用require-dev
标志阻止此部分,否则还会安装--no-dev
部分。另请注意,程序包名称不一定与Packagist上发布的内容相关联,您还可以使用可指向其他来源的部分repositories
。
ad 2。:
创建vendor/autoload.php
以外的任何文件都是Composer的内部文件,你不应该搞乱它。 Composer将阅读所有autoload
和autoload-dev
的定义(除非给出--no-dev
)部分,并从中编译并使用适当的自动加载器。这包括对其他软件包包含所有require
和require-dev
的主要软件。
根据已定义的自动加载类型,编译的行为会有所不同:PSR-4,PSR-0,类图或文件。
ad 3。:
如果包没有autoload
部分,则无法自动加载任何代码。假设程序包的作者一切正确,可以安全地假设自动加载将正确进行,具体取决于自动加载的类型(PSR-4,PSR-0,类图或文件)。
一个包可以包含多个自动加载条目,并且可以负责多个名称空间。 autoload_namespaces.php
中的条目通常与理解Composer自动加载无关:软件包定义了一些自动加载,软件要求软件包包括vendor/autoload.php
,开发人员从文档中知道有一个类{ {1}}只需使用它:WhateverNamespace\Foo
或$class = new WhateverNamespace\Foo()
。
不要假设从包名到命名空间,或从命名空间到文件夹名称的任何连接。在Composer中,所有内容都可以以不同的名称命名(尽管它很容易混淆,这很少是一个好主意),没有强制规则说明名为use WhateverNamespace\Foo; $class = new Foo()
的包必须使用名称空间GreatVendor/Awesome
或任何名称相同的文件夹布局。使用类映射,任何类都可以托管在任何文件中,一个类可以托管在一个文件中,并且仍然可以使用GreatVendor\Awesome
包含代码。
一般情况是任何最近的软件包都会坚持使用PSR-4或至少PSR-0并使用命名空间。但请注意,它的起源来自代码本身,而不是来自Composer。 Composer将只执行定义的自动加载定义并相应地执行操作,它不会神奇地干扰更改名称空间或其他内容。它仍然是基本的PHP,具有通用接口的额外好处,它告诉通用自动加载器如何在需要时找到类。
ad 4。:
没有“自定义命名空间”。 “风俗”应该是什么意思? include/require(_once)
部分必须与编写的代码匹配,您不能使用Composer将代码中的命名空间更改为不同的命名空间。
autoload
不是自动加载定义的唯一来源。
Composer将很好地处理重复的命名空间条目。如果有重复的类定义,它必须失败,但只要名称空间前缀只有重叠(如autoload_namespaces.php
和GreatVendor
使用的GreatVendor\Cache
),Composer会告诉他们。