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