Laravel 5.4中的混合/版本图像?

Laravel 5.4中的混合/版本图像?,laravel,laravel-5,laravel-5.4,Laravel,Laravel 5,Laravel 5.4,我想在一组图像上使用mix。首先,我复制它们: mix.copy('resources/images', 'public/images'); 然后版本: mix.version(); 以上内容对图像没有任何影响 我还尝试指定路径: mix.version('public/images/*'); 但我得到一个没有这样的文件或目录错误 如何对图像进行版本设置?version()(无参数)不应用于传递到copy()和copyDirectory()的文件 如果您查看mix.version的源代码,

我想在一组图像上使用mix。首先,我复制它们:

mix.copy('resources/images', 'public/images');
然后版本:

mix.version();
以上内容对图像没有任何影响

我还尝试指定路径:

mix.version('public/images/*');
但我得到一个没有这样的文件或目录错误

如何对图像进行版本设置?

version()
(无参数)不应用于传递到
copy()
copyDirectory()
的文件

如果您查看
mix.version
的源代码,就会发现它同步扩展了glob。但是所有的
laravelmix
操作,例如
copy
version
都是异步执行的。这意味着
public/images/*
为空,因为
public
目录中还没有文件

作为一种解决方法,您可以列出源目录中的文件(从中复制文件,例如
资源
),将
资源
路径段替换为
公共
,并将此列表传递到
版本()

在我的例子中,我在
resources
目录中有各种资产,所以目录树看起来像:

- resources
  | - css
  | - fonts
  | - images
  | - js
  | - less
const mix = require('laravel-mix'),
    glob = require('glob');

mix.disableNotifications();

const
    directoriesToCopy = ['css', 'fonts', 'images', 'js'],
    publicDir = 'public/',
    publicCssDir = publicDir + 'css/',
    resourcesDir = 'resources/',
    resourcesLessDir = resourcesDir + 'less/',
    lessFiles = glob.sync('**/*.less', {cwd: resourcesLessDir});

directoriesToCopy.forEach(d => mix.copyDirectory(resourcesDir + d, publicDir + d));

lessFiles.forEach(f => mix.less(resourcesLessDir + f, publicCssDir + f.slice(0, -'less'.length) + 'css'));

mix.version([].concat(...directoriesToCopy.map(d => glob.sync('**/*', {cwd: resourcesDir + d}).map(f => d + '/' + f))).map(f => publicDir + f));
我需要复制到
public
并对所有这些目录进行版本设置,但
less
除外,我需要对其进行预处理并进行版本设置

这就像我的
webpack.mix.js
看起来像:

- resources
  | - css
  | - fonts
  | - images
  | - js
  | - less
const mix = require('laravel-mix'),
    glob = require('glob');

mix.disableNotifications();

const
    directoriesToCopy = ['css', 'fonts', 'images', 'js'],
    publicDir = 'public/',
    publicCssDir = publicDir + 'css/',
    resourcesDir = 'resources/',
    resourcesLessDir = resourcesDir + 'less/',
    lessFiles = glob.sync('**/*.less', {cwd: resourcesLessDir});

directoriesToCopy.forEach(d => mix.copyDirectory(resourcesDir + d, publicDir + d));

lessFiles.forEach(f => mix.less(resourcesLessDir + f, publicCssDir + f.slice(0, -'less'.length) + 'css'));

mix.version([].concat(...directoriesToCopy.map(d => glob.sync('**/*', {cwd: resourcesDir + d}).map(f => d + '/' + f))).map(f => publicDir + f));

基本上,我使用
glob
递归地获取每个复制目录中所有文件的列表,将路径中的
resources
替换为
public
,然后将所有此类文件的列表传递给
mix.version

我知道这是一个老问题,但对于2019-laravel mix 4,您可以使用:

mix.copy('resources/images/*', 'public/images');
mix.version();
这将对所有复制的文件进行版本设置不要使用以下选项之一:

mix.copy('resources/images/*', 'public/images/*'); 
mix.copy('resources/images/', 'public/images/*'); 
mix.copyDirectory('resources/images/*', 'public/images'); 
->届时将不会对文件进行版本设置

要查看结果,请查看public/mix-manifest.json:

"/favicon.ico": "/favicon.ico?id=ecb5fdce0172885513c8",
要在代码中使用它,请使用laravel mix助手方法:mix()


这将产生如下结果:

<link rel="icon" type="image/x-icon" href="/favicon.ico?id=ecb5fdce0172885513c8" />


你知道如何解决这个问题吗?@BitByBit请看下面我的答案。