在Symfony2中使用Composer添加CSS或JS库作为依赖项的正确方法是什么?

Cho*_*per 19 php symfony composer-php

Symfony 2文档中,它说:

捆绑包不应嵌入用JavaScript,CSS或任何其他语言编写的第三方库.

那我该怎么做?我想使用Composer安装Twitter Bootstrap,DataTables和许多其他东西作为依赖项.但我能想到的唯一方法是创建一个包并嵌入它们.

这样做的正确方法是什么?

Jos*_*era 13

你应该通过Twitter 使用Bower.它是HTML,CSS和Javascript的包管理器.它的创建是为了解决您遇到的这个问题.


Tiv*_*vie 6

编辑:截至目前,JS库的包管理器非常好,如Bower,Jam或Component.

版本控制系统

语义版本控制 - Composer建议使用语义版本控制系统.它使用XYZ设置,其中X是主要版本,Y是次要版本,Z是补丁版本.Y和Z应始终向后兼容,而X反映代码的变化,MIGHT向后兼容.

Embeding

嵌入应该被视为复制并粘贴代码(和二进制)作为库的一部分,而不是将其作为第三方(供应商)包/包.它包括在资源文件夹中包含query.js或将推进代码复制并粘贴到包内的文件夹中.

为什么不嵌入第三方库

捆绑包不应嵌入用JavaScript,CSS或任何其他语言编写的第三方库.

本声明来自最佳实践观点.嵌入(如复制/粘贴)任何类型的第三方库(特别是PHP库)通常不是一个好主意.例如,假设BUNDLE A使用LIBRARY FOO v1.4.1,BUNDLE B也使用LIBRARY FOO但使用不同版本v1.5.2.如果任何BUNDLES(A或B)嵌入了FOO lib,它们可能(很可能会)变得不兼容.例如,php类和函数不能重新声明.当然,任何捆绑包都可以使用变通方法来缓解这个问题,例如命名它们的FOO版本或自动加载规则,但这会增加其他问题,除了肯定会增加内存使用量,因为有两个版本的同一个东西被解析通过PHP.

如果PHP包不遵循这个最佳实践,那么出现的错误通常很容易被发现(有错误:无法重新定位函数blablabla).但是,对于Javascript库,情况并非如此.您可以重新声明函数(因为它们是对象属性).因此,如果现在FOO是JS Lib,而BUNDLE A和B将它们嵌入到它们的库中,当它们被包含在内时,会出现奇怪的问题.例如,可以重新声明一个函数,该函数缺少其中一个包的关键功能并打破它.

Symfony是一个PHP框架.

它处理PHP库/包.Symfony建议要求库作为依赖而不是嵌入它,因为它使用Composer作为包管理器,它负责下载和加载require包.据我所知,当2个软件包/软件包使用相同的库时,如果它们具有不同的版本要求,则使用最实际的版本,除非它的向后不兼容.然后,Composer会报告您必须手动解决的冲突.

但是......没有办法正确处理JavaScript库.那是因为Composer是PHP库的包.您可以通过两种我能想到的方式来解决这个问题:(可能有更多更好的方法来解决这个问题,我只想到这两个,将它们作为建议阅读)

  1. 围绕javascript库创建一个PHP包装器并包含它(尽管如果另一个bundle决定做同样的事情但给包提供不同的名字,这可能会产生同样的问题)
  2. 通过composer创建一个需要javascript库作为第三方依赖的bundle.由于javascript库可能在其存储库中没有composer.json文件(有时它们作为独立的缩小文件存在),这可以通过创建自定义编写器安装程序,分叉javascript存储库(例如在gitHub中)来实现一个composer.json,等等...但是,你需要不断维护和升级所述库,这可能很麻烦.

你必须记住:

  1. 必须公开公开JS和CSS库,以便客户端可以访问它(安全注意事项)
  2. Symfony是一个PHP框架,处理服务器端软件包.JS/CSS是客户端.考虑到这一点,它可以正常工作.
  3. symfony背后的主要思想之一(与其他PHP框架一样)是项目内部和项目之间的代码可重用性.纯Javascript库本身可以重用.它们通常是独立的.此外,从服务器端"捆绑"JS库并没有真正的好处.您不需要任何类型的捆绑来实现可重用性.

我的方法

由于编写器系统非常吸引人,特别是在将bundle/packages/library部署到其他人时,我使用第三方javascript/css库的方法是创建一个特定于JS/CSS 的依赖管理器,其他包/ bundle可以依赖它照顾他们的JS/CSS依赖关系而不用担心这个问题.

我的消化

如果您计划向公众发布项目,即作为symfony包,您应该仔细计划如何处理这个问题.如果您的项目是自包含的(个人使用或客户端,而不是广泛使用),则由于您(程序员)完全控制您使用的第三方工具并将其包含在项目中,因此其相关性要低得多.这些只是避免未来问题的最佳实践"建议".

  • 我同意@ChocoDeveloper.我目前正在构建ZF2模块来从tarball或不同的路径(yeoman等)更新JS库,并且可以通过调整其安装程序(尽管仍在使用它)来使用这样的作曲家.这只是一个以与curl/wget非常相似的方式获取文件的问题.软件包可能不应包含存在于自己项目中的互联网库. (3认同)