使用Composer的开发/生产切换时如何正确部署?

2024-02-26

Composer 可以选择仅在开发时加载多个依赖项,因此这些工具不会安装在生产环境中(在实时服务器上)。 (理论上)这对于仅在开发中有意义的脚本非常方便,例如测试、假数据工具、调试器等。

解决的方法是添加一个额外的require-dev使用开发中所需的工具进行阻止:

"require-dev": {
    "codeception/codeception": "1.6.0.3"
}

然后(理论上)通过加载这些依赖项

composer install --dev

问题与疑问:

作曲家改变了行为install and update2013年戏剧性地,require-dev-现在默认安装依赖项(!),请随意创建一个包含以下内容的composer.jsonrequire-dev阻止并执行composer install重现。

最常见的部署方式是推动作曲家。lock(保存您当前的作曲家设置)然后执行composer install在生产服务器上,这还将安装开发内容。

部署这个的正确方法是什么without安装 -dev 依赖项?

Note: I'm trying to create a canonical Q/A here to clarify the weird Composer deployment. Feel free to edit this question.


Why

恕我直言,Composer 有充分的理由使用--dev默认标记(安装时and更新)现在。 Composer 主要在需要这种行为的场景中运行:

Composer 的基本工作流程如下:

  • 一个新项目开始了:composer.phar install --dev、json 和 lock 文件提交到 VCS。
  • 其他开发人员开始从事该项目:检查 VCS 和composer.phar install --dev.
  • 开发人员添加依赖项:composer.phar require <package>, add --dev如果您想要包裹在require-dev部分(和提交)。
  • 其他人也跟着走:(结帐并)composer.phar install --dev.
  • 开发人员想要更新版本的依赖项:composer.phar update --dev <package>(并提交)。
  • 其他人也跟着走:(结帐并)composer.phar install --dev.
  • 项目部署:composer.phar install --no-dev

正如你所看到的--dev标志的使用(远)多于--no-dev标志,特别是当从事该项目的开发人员数量增加时。

生产部署

在不安装“dev”依赖项的情况下部署它的正确方法是什么?

嗯,composer.json and composer.lock文件应提交至 VCS。不要省略composer.lock因为它包含有关应使用的包版本的重要信息。

执行生产部署时,您可以传递--no-dev给作曲家的标志:

composer.phar install --no-dev

The composer.lock文件可能包含有关开发包的信息。这没关系。这--no-devflag 将确保那些开发包没有安装。

当我说“生产部署”时,我指的是旨在用于生产的部署。我并不是在争论是否composer.phar install应该在生产服务器或可以进行审查的临时服务器上完成。这不是这个答案的范围。我只是指出如何composer.phar install无需安装“dev”依赖项。

Offtopic

The --optimize-autoloader标志在生产中也可能是理想的(它生成一个类映射,这将加速应用程序中的自动加载):

composer.phar install --no-dev --optimize-autoloader

或者当自动化部署完成时:

composer.phar install --no-ansi --no-dev --no-interaction --no-plugins --no-progress --no-scripts --optimize-autoloader

如果你的代码库支持它,你可以换掉--optimize-autoloader for --classmap-authoritative。更多信息here https://getcomposer.org/doc/articles/autoloader-optimization.md

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用Composer的开发/生产切换时如何正确部署? 的相关文章

  • 使 pdo::query 静态

    当我运行下面的代码时出现此错误 我通常使用 msql 函数 但我尝试使用 PDO 代替 怎么了 致命错误 第 14 行无法静态调用非静态方法 PDO query
  • 自定义 WP 主题时,我应该将导航栏放在“”标签之前还是之后?

    我正在通过制作子主题来自定义 WP 主题 我将 Bootstrap 中的导航栏放入子主题目录中的 header php 文件中 但是 我不确定在哪里放置导航栏代码 我可以把它都放在前面and之后标记成功 例如 无论我选择哪一个 导航栏都显示
  • PHP 绑定“bigint”数据类型(MySQLi 准备好的语句)

    studentId 57004542323382 companyOfferId 7 sql INSERT INTO studentPlacement companyOfferId studentId VALUES if stmt db gt
  • zip 文件的校验和

    我目前正在开发一个工具 它上传一组文件 然后使用 md5 校验和将文件与上一批上传的文件进行比较 并告诉您哪些文件已更改 对于常规文件 这工作正常 但某些上传的文件是 zip 存档 即使其中的文件相同 它们几乎总是会发生变化 有没有一种方法
  • 为什么这会返回资源 id #2? [复制]

    这个问题在这里已经有答案了 可能的重复 我如何从 PHP 中的 MySql 响应中 回显 资源 id 6 https stackoverflow com questions 4290108 how do i echo a resource
  • 在 Laravel 5 中截断表

    描述 我有一个充满测试数据的表 有时 我想清除它以获取新数据 我可以在 DBMS 应用程序中执行截断 例如MySQL 工作台 但我试图在我的应用程序中实现它 Goal 创建一个按钮 单击时截断数据库中的表 这是我的步骤 1 声明一条路线 R
  • 阻止注销页面后的后退按钮

    我有 php 注销页面 当用户单击注销链接时 请参阅此页面并重定向到索引页面 但是当单击后退按钮时 我会看到带有用户数据的上一页 当然 当我刷新页面时 我看不到以前的页面和数据 我在单击注销并单击后退按钮后检查了其他代码 drupal 但我
  • 如何通过php的require()或include()函数传递变量?

    当我使用这个时 require diggstyle code php page page no 警告是 无法打开流 第 198 行 C xampp htdocs 4ajax gallery core php 中没有错误 错误是 Failed
  • 使用先前的反向引用作为命名捕获组的名称

    有没有办法使用对先前捕获组的反向引用作为捕获组的名称命名捕获组 这可能不可能 如果不可能 那么这就是一个有效的答案 下列 data description some description preg match data matches p
  • 如何使用 Twig 的属性函数访问嵌套对象属性

    我试图使用一个树枝变量来访问另一个树枝变量的属性 直到我找到 属性 函数为止 该变量才起作用 除了需要访问嵌套属性的情况外 效果很好 当包含属性的变量实际上是对象 属性时 它不起作用 例如 attribute object1 variabl
  • 如何阻止直接访问我的 JavaScript 文件?

    我使用 Minify 来缩小并缓存所有脚本请求 我只希望我的用户能够访问 JavaScript 文件的缩小版本 缩小位于www example com min我的脚本位于www example com scripts 如何阻止直接访问doc
  • 语法错误,第 288 行出现意外的“endif”(T_ENDIF)[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我一直在离线处理我的 WordPress 网站的此代码错误 解析错误 语法错误 homez 541 photoher marie
  • fgetcsv 在特定行打开?

    有没有办法使用 fgetcsv 在特定行上打开 我有一个非常大的 csv 想通过 ajax 一次运行大约 100 行 我可以轻松停止 while 循环 但如何在特定行上打开 或者这是不可能的 从第 100 行开始读取没有简单的方法 但您可以
  • phpunit测试调用其他需要mock的类方法的方法

    我正在尝试创建一个非常标准的单元测试 在其中调用一个方法并断言它的响应 但是我正在测试的方法调用同一类中的另一个方法 该方法做了一些繁重的工作 我想模拟该方法 但仍按原样执行我正在测试的方法 仅使用从调用另一种方法返回的模拟值 我简化了示例
  • 从数据库填充复选框

    我有两个表 第一个由与名称关联的 id 组成 1 汽车 2 火车 3 普通 ETC 第二个表由两个字段 user id 和第一个表中的 id 组成 例如 1 1 2 1 3 当用户转到该页面时 我试图重新填充选定的复选框 首先 您查询数据库
  • 从支付网关重定向回时用户会话丢失

    我已将 Cyber source 配置为我的支付网关 我能够导航到 cybersource 并进行付款 并能够成功重定向回该网站 我也可以取消付款并重定向回我的网站 我收到来自支付网关的响应 但是 用户在从支付网关重定向回来时会被注销 我正
  • php curl 使用 GET 发送变量 奇怪的结果

    我正在尝试调用远程站点上页面中的网址 决定使用curl 在远程站点上 url 变量显示为 REQUEST Array var1 gt val1 amp var2 gt val2 amp var3 gt val3 被调用的url是 http
  • Laravel $request->file() 返回 null

    尝试在后端使用 Laravel 上传文件时遇到问题 Issue Laravel request gt file 方法返回 null Setup 我使用以下方法构建了一个 AJAX 请求超级代理人 https github com visio
  • 为什么我的会话仍然存在?

    我一定很愚蠢 因为似乎一件相当明显的事情现在让我完全困惑 我有一个会议 ie SESSION handbag id 在某个时刻 我需要彻底终止这个会话 ie at the start of the page session start el
  • 一种无需 JavaScript 即可在 PHP 中确定浏览器宽度的方法?

    首先有吗 或者我必须使用javascript 我希望能够更改使用的 CSS 因此 frex 我可以为移动设备或其他设备加载较小的字体 不幸的是 仅使用 PHP 无法检测用户分辨率 如果您使用 Javascript 则可以在 cookie 中

随机推荐

  • Sql 查询仅返回第一行

    我尝试显示选择查询的结果 但我只得到重复的第一行而不是所有行 这是我的代码 query SELECT Email from client result db gt query query gt fetch foreach result as
  • Spring 利用 Mongo 通过 JPA 实现

    我对 Spring 框架相当陌生 并且在设置我当前正在处理的项目时遇到了一些问题 我需要能够连接到两个不同的数据库 一个是 MongoDB 另一个是 MSSQL 我正在使用 JPA 连接到 MSSQL 我遇到的问题是 当我希望它调用 MSS
  • 是否可以从 ASP.NET 4.0 中的服务器错误页面中删除信息?

    为了更好地向用户隐藏信息 我正在尝试删除版本信息标准 ASP NET 错误屏幕中的部分 自定义错误已启用 但是在某些情况下 如果您设法遇到超出您控制范围的错误 也许是服务器问题 那么您可以联系 YSOD 我尝试更改 web config 以
  • 列表包中 R 代码块的颜色

    我希望在 LaTeX 文档中插入 R 代码块 默认设置为listings包还改变了字体 但没有改变我需要的颜色 虽然我知道我可以使用lstset功能 我不太确定组合起来会好看 因此 任何人都可以分享他们的lstset设置为listings封
  • React Native - 设备后退按钮处理

    我想检查当按下设备后退按钮时是否有多个屏幕在堆栈上 如果是 我想显示上一个屏幕 如果否 我想退出应用程序 我已经检查了一些例子 但那些使用BackAndroid and Navigator 但它们都已被弃用 BackHandler是替代Ba
  • Chrome 中大图像的淡入淡出

    我在大图像中淡入淡出时遇到一些问题 但仅限于 Chrome 这是绝对基本的设置 document ready function var img new Image img hide load function this fadeIn 300
  • GWT:如何抑制超链接,以便它不会更改我的历史标记

    我想让我的超链接像按钮一样工作 仅响应 Click 事件 但是 当您单击它们时 它们会自动更改历史记录令牌 这会弄乱我的应用程序中的历史记录机制 有没有办法抑制超链接的默认行为 以便它不会更改历史标记 我尝试将 targetHistoryT
  • Javascript 数组排序是异步的吗? [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 Javascript Array sort 函数是异步的吗 我不这么认为 但是当我运行以下代码时 它似乎确实是 alph
  • vs code 终端每次都会更改为 powershell [重复]

    这个问题在这里已经有答案了 在 Vs code 更新 1 60 0 后 终端打开 powershell 但默认保持不变 git bash 如果我创建新终端 那么它会打开 git bash 当我启动应用程序时 它看起来像 然后我必须创建新的
  • Python初始化

    我有这个代码 def init self a b c d self a a self b b etc 我正在考虑将其替换为 def init self a b c d args locals for key in args self dic
  • ASP .NET MVC5 中的 CORS

    我有一个 MVC 项目 其中有几个想要公开跨域的 JSON 控制器方法 不是整个网站 只是这两种方法 我基本上想要这篇文章中针对 cors 所说的确切内容 http enable cors org server aspnet html ht
  • 过滤 fiddler 仅捕获特定域的请求

    我不确定如何修改 CustomRules js 文件以仅显示特定域的请求 有谁知道如何做到这一点 这很容易做到 在过滤器选项卡上 单击 仅在过滤器包含时显示 然后键入您的域
  • 如何使用 Enthought python (Canopy) 安装 CVXOPT

    在开始之前 让我为这篇文章添加替代标题 如何使用 Intel MKL 编译 CVXOPT 如何更改 CVXOPT 中的 init py 以使用 Intel MKL 进行编译 让我解释一下这个问题 我正在尝试使用 Enthought pyth
  • JUnit4 和 JUnit5 测试未在 IntelliJ 中运行

    我试图在 IntelliJ IDEA 2017 1 5 的同一个项目中使用 JUnit4 和 JUnit5 测试 到目前为止 所有测试都基于 JUnit4 我添加了jupiter platform and vintage对我的 pom xm
  • clang++ 和 O2 的未定义引用

    我正在一个项目上尝试 CLang 3 4 和 libc 但在发布模式下出现奇怪的链接错误 home wichtounet dev eddic src ast Operator cpp 17 error undefined reference
  • 如何调整规范模式来评估对象的组合?

    我知道规范模式描述了如何使用类的层次结构来实现ISpecification
  • Xcode 并排代码比较选项在哪里?

    从 Xcode 13 开始 代码比较默认不再是并排差异 一定还有办法做到这一点 我正在努力寻找选择 点击Code Review 屏幕截图上的蓝色按钮 一个箭头指向左侧 另一个箭头指向右侧 或在View Menu 然后 在第二个图标上 选择S
  • 关闭 Twitter Bootstrap Navbar 过渡动画

    就像http twitter github com bootstrap http twitter github com bootstrap 我现在工作的网站是响应式的 我想删除过渡动画 当我单击折叠的导航栏菜单按钮时 上图是我所问问题的截图
  • 如何使用 IIS 为 Amazon EC2 服务器启用 FTP 被动模式

    我最初在使用 pagelime 时遇到了问题 它要求用户使用被动模式并且不支持主动模式 让主动模式工作起来非常简单 但让被动工作模式需要付出更多的努力 我正在使用带有 IIS 的 Amazon EC2 服务器以及 FTP 站点 以下链接最终
  • 使用Composer的开发/生产切换时如何正确部署?

    Composer 可以选择仅在开发时加载多个依赖项 因此这些工具不会安装在生产环境中 在实时服务器上 理论上 这对于仅在开发中有意义的脚本非常方便 例如测试 假数据工具 调试器等 解决的方法是添加一个额外的require dev使用开发中所