我的网站分为单独的模块。每个模块在/protected/modules/my_module/assets/css
或js
的js文件中都有自己的特定css或js文件。当我第一次使用使用我的资产的页面时,Yiis资产管理器创建文件夹。 不幸的是,如果我改变我的文件中的某事 - Yii不重新加载我的CSS或JS文件。我必须手动删除/projects/assets
文件夹。开发应用程序时真的很烦人。有没有办法强制Yii在每个请求上重新加载模块资源?
有没有办法强制Yii每次请求重新加载资产?
我的网站分为单独的模块。每个模块在/protected/modules/my_module/assets/css
或js
的js文件中都有自己的特定css或js文件。当我第一次使用使用我的资产的页面时,Yiis资产管理器创建文件夹。 不幸的是,如果我改变我的文件中的某事 - Yii不重新加载我的CSS或JS文件。我必须手动删除/projects/assets
文件夹。开发应用程序时真的很烦人。有没有办法强制Yii在每个请求上重新加载模块资源?
有没有办法强制Yii每次请求重新加载资产?
在components/Controller.php
添加以下(或调整现有beforeAction
):
protected function beforeAction($action){
if(defined('YII_DEBUG') && YII_DEBUG){
Yii::app()->assetManager->forceCopy = true;
}
return parent::beforeAction($action);
}
这样做是什么,任何行动开始之前,该应用程序会检查,如果你是在调试模式下,如果因此,将设置资产管理器强制每个页面加载重新复制所有资产。
参见:http://www.yiiframework.com/doc/api/1.1/CAssetManager#forceCopy-detail
我没有测试过这一点,但基于我相信它应该工作正常的文件上。
注意:此代码在beforeAction
之内的放置仅仅是放置位置的示例。您只需将forceCopy
属性设置为true,然后再调用publish()
,并将其放入beforeAction
即可实现该目标。
一个或者解决方案是发布模块的资产是这样的:
Yii::app()->assetManager->publish($path, false, -1, YII_DEBUG);
第四个参数强制执行资产的副本,即使他们在那里已经发布。 有关详细信息,请参阅publish()上的手册。
在每个请求中重新发布资源可能需要大量资源,对开发不利。
进行开发,它更容易使用 CClientScript的linkAssets
功能。资产被发布为符号链接目录,并且不必重新生成 。请参阅: http://www.yiiframework.com/doc/api/1.1/CAssetManager#linkAssets-detail
分期/生产,你应该清理资产/文件夹更新程序/脚本的 一部分。
只有退回到另一种解决方案,如果由于某种原因,你不能在开发机器(不太可能)上使用的符号链接。
非常有趣的解决方案。我会研究它,但它看起来非常有前途,而且确实比发布每项请求的资产要快。 – Joe 2014-01-13 09:15:35
如果您使用的是Yii2,则通过配置有一个更简单的解决方案。
以下内容添加到您的'config/web.php'
:
if (YII_ENV_DEV) {
// configuration adjustments for 'dev' environment
// ...
$config['components']['assetManager']['forceCopy'] = true;
}
这迫使AssetManager到所有文件夹复制每次运行。
..或者你可以简单地在**组件的** assetManager **部分添加''forceCopy'=> YII_DEBUG'** – verybadbug 2014-12-11 04:25:56
在YII 1中配置有:
'components'=> [
...
'assetManager' => array(
'forceCopy' => YII_DEBUG,
...
)
...
]
提示:'定义(YII_DEBUG)'时并不需要 - 这将总是被定义为TRUE;或'FALSE'。 – 2013-03-25 15:45:21