【问题标题】:Can the Yii2 assets pipeline watch subdirectories?Yii2 资产管道可以监视子目录吗?
【发布时间】:2015-06-03 09:29:50
【问题描述】:

我尝试使用SASS guidelines 来获取我的样式表。指南建议将所有代码放在按主题分类到 7 个文件夹中的文件中(在我们的例子中是 6 个,由于 Yii 处理依赖项的方式)。

Yii2 资产管道似乎只关注$sourcePath 的变化,而忽略了子目录。更改子目录中的文件不会触发重新编译。我不得不通过$config['components']['assetManager']['forceCopy'] = true; 强制重新编译,以确保所有内容都在页面重新加载后编译。这将重新编译所有资产,所需时间大约是重新编译 scss 文件的 3 倍。在土豆上工作真的很烦人。

有没有一种简单的方法让 Yii 资产管道知道子目录,这样我就可以不用每次都重新编译了?

【问题讨论】:

    标签: php yii2


    【解决方案1】:

    事实上你可以,但需要一些努力。

    在您的AsssetBundle::init()-函数中,查看是否有任何子文件夹的修改时间比普通文件夹中的更新时间晚,然后才将 forceCopy 设置为 true。

    public function init()
    {
       parent::init();
       $modified = filemtime($this->sourcePath)
       foreach(['my', 'list', 'of', 'subfolders'] as $folder) {
          $subfolderModified = filemtime($this->sourcePath . '/' . $folder);
          if ($subfolderModified > $modified) {
             $this->publishOptions['forceCopy'] = true;
             break;
          }
       }
    }
    

    请注意,这主要是虚拟代码,但它只是向您展示我的想法的要点。

    【讨论】:

    • 非常感谢,我完全不知道publishOptions。不过,这似乎并不完全正确。无论最近是否有更改,上述代码都会导致重新编译。我选择了以下内容,效果几乎相同:public $publishOptions = [ 'forceCopy' => YII_ENV === 'dev', ];
    • 如果你实施和测试它,它不应该。正如我所说:这只是代码的要点,未经测试。鉴于您用作最终解决方案(始终在开发环境中重新编译),您似乎正在寻找与您在问题中提出的不同的东西(仅在开发环境中编译)。
    • $this->sourcePath 的修改时间并不能很好地指示上次编译文件的时间。我想我可以通过使用生成的 CSS 文件来使它工作,但它只在发布的目录中并且不容易访问。我得另辟蹊径。
    • 因为哈希是根据源路径及其最后修改时间生成的,这意味着(如果您的资产包正在发布)它总是在一个新的目录中(除非forceCopy 已启用)。一般情况下你没有编译过的版本。
    • 我也会这样做,但我的一台开发机器只是太慢了。它现在与 mtime 更新的touch 配合得很好。再次感谢您的帮助! :)
    猜你喜欢
    • 2012-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-29
    • 1970-01-01
    • 1970-01-01
    • 2018-12-10
    相关资源
    最近更新 更多