我的网站分为不同的模块。对于js文件,每个模块都在/protected/modules/my_module/assets/css
或js
中拥有自己的特定css或js文件。当我第一次使用使用我的资产的页面时,Yiis资产管理器创建文件夹。
不幸的是,如果我在我的文件中更改某些内容 - Yii不会重新加载我的css或js文件。我必须手动删除/projects/assets
文件夹。在开发应用程序时,这真的很烦人。
有没有办法迫使Yii每次请求重新加载资产?
答案 0 :(得分:21)
在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
之前将publish()
属性设置为true,并将其置于beforeAction
中即可实现该目标。
答案 1 :(得分:11)
如果您正在使用Yii2,那么通过配置可以获得更简单的解决方案。
将以下内容添加到'config/web.php'
:
if (YII_ENV_DEV) {
// configuration adjustments for 'dev' environment
// ...
$config['components']['assetManager']['forceCopy'] = true;
}
这会强制AssetManager复制每次运行的所有文件夹。
答案 2 :(得分:3)
另一种解决方案是发布您的模块资产:
Yii::app()->assetManager->publish($path, false, -1, YII_DEBUG);
第四个参数会强制执行您的资产副本,即使这些资产已经发布。 有关详细信息,请参阅publish()上的手册。
答案 3 :(得分:2)
根据每个请求重新发布资产可能需要大量资源,并且对于开发来说是不可靠的。
对于开发,使用linkAssets
功能要容易得多
CClientScript。资产作为符号链接目录发布,并且
永远不必再生。看到:
http://www.yiiframework.com/doc/api/1.1/CAssetManager#linkAssets-detail
对于登台/制作,您应该清除资产/文件夹 更新例程/脚本的一部分。
如果由于某种原因您不能在开发计算机上使用符号链接(不太可能),则只回退到其他解决方案之一。
答案 4 :(得分:1)
在配置中的YII 1中我们有:
'components'=> [
...
'assetManager' => array(
'forceCopy' => YII_DEBUG,
...
)
...
]