如何将composer的vendor文件夹中的CSS和JS文件复制到public目录?

15

我刚开始学习几个PHP框架。我尝试的例子都使用了composer,但我以前从未使用过,所以现在还不太清楚。

我在composer.json中指定了一些JS和CSS库,然后运行composer install。 现在这些库被添加到了vendor文件夹中。

现在我该如何使用那些文件夹中的JS和CSS文件呢?例如,bootstrap/dist/css/bootstrap.min.css? 我尝试的例子要么只是在public/css文件夹中复制一份,要么使用远程链接,比如在一个volt文件中使用<link href="//netdna.bootstrapcdn.com/bootswatch/2.3.1/united/bootstrap.min.css" rel="stylesheet">

由于某种原因,我不喜欢在我的应用程序中使用这样的远程链接(我担心它们有一天会“失效”)。 但是另一种选择也不是很美观,我想,因为我仍然必须从vendor中选择正确的文件复制到public中。

难道没有一种“自动”的方法来做到这一点吗?或者通过在控制器中指定,然后将文件复制到public中?

1个回答

9

Composer是用于获取PHP依赖项的工具。它与其他Web资源(如CSS或JS文件)不兼容。

Composer Asset Plugin

为了解决获取资源的问题,François Pluchino(fxp)开发了Composer Asset插件。它为Composer提供了一个NPM / Bower依赖项管理器。它是这些依赖项管理器的桥梁,并将其获取到vendor文件夹中。

请记住,您始终可以直接使用Bower或NPM。 使用composer.json定义的Composer获取您的PHP依赖项。 使用bower.json定义的Bower获取您的资产。 这可能是一种更清晰的方法。

文档 - Packagist

您可以从CLI中要求它:composer require fxp/composer-asset-plugin

例如,要获取“Twitters Bootstrap”和“Jquery”等资产:

{
    "require": {
        "bower-asset/bootstrap":     "dev-master",
        "bower-asset/jquery-2.1.0":  "2.1.0"
    }
}

一些框架提供自定义处理程序用于资产,主要是为了支持它们各自的文件夹布局并从供应商文件夹中将东西复制到正确的位置。我不知道Phalcon是否有提取资产的功能。
难道没有一种“自动”完成这个过程的方法吗?或者通过在控制器中指定,然后将文件复制到公共目录中?
从供应商文件夹中将资产复制到应用程序布局的正确位置是另一回事。
没有自动完成此操作的方式。您必须自己提供机制。
例如,您可以将安装路径从供应商更改为public/assets或其他内容,请参见https://github.com/francoispluchino/composer-asset-plugin/blob/master/Resources/doc/index.md#define-a-custom-directory-for-the-assets-installation 插件不会复制任何东西。
Bower + Grunt(简而言之:使用Bower获取资产,使用Grunt复制文件)。
最接近“指定控制器”的方法是设置一个Grunt任务,将仅从web/assets/vendor复制与Bower获取的相关内容到web/assets/app文件夹中。
换句话说:即使像Bower这样的JS包管理器也不提供自动复制主API文件。Bower会将最新版本的jQuery获取到一个定义好的vendor文件夹中,但它不会自动将jquery.min.js复制到web/assets/js/jquery.min.js中。您需要在其上添加一个任务。

谢谢,有一件事我还不太明白:既然所有正确的资源都似乎已经被Composer下载/安装了,那我为什么需要一个单独的资产依赖管理器呢?或者你是指可能一些JS文件依赖于其他包,例如“jQuery UI”需要“jQuery”吗?这个插件是否也会将它们下载到“vendor”中? - Dylan
单独的依赖管理器具有干净的配置文件的优点。您不必添加前缀配置内容到composer.json中才能使桥接工作。分离的配置,您知道每个部分应该放在哪里。PHP composer.json Assets bower... - 是的,这些资产可能也有依赖关系... 换句话说,值得看一下Bower用于JS和CSS资产。- 是的,Composer资产插件将它们下载到供应商文件夹中,除非您定义了自定义目录或自己复制/移动文件。 - Jens A. Koch
我已经将Bower + Grunt的组合添加到答案中。 - Jens A. Koch
哇,太棒了,这样一个完整的回答。我也在研究同样的问题,得出了相同的结论。难怪你是最好的贡献者之一,你的回复总是值得至少一个用户投两票支持。 - FantomX1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接