eslint на динамически меняющийся список файлов
Я хотел бы бежать eslint
только на измененные файлы. Я создал новую цель запуска в package.json
бежать eslint
из командной строки (git diff --name-only --relative | grep -E '.*\\.(vue|js)$' | xargs eslint --ext .js,.vue
). Теоретически, это должно работать нормально, но в моем проекте происходит небольшой шаг преобразования (замена строки) при объединении файлов с веб-пакетом, который скинет eslint
(некоторая нестандартная разметка будет расширена до JS).
Какие у меня варианты и как мне их реализовать? Например, могу ли я выполнить конкретное правило / загрузчик веб-пакета и передать результат в eslint
? Другой вариант, который я вижу, это включить eslint
в процесс правила / загрузчика webpack (вместо того, чтобы выполнять его из командной строки), но как мне тогда фильтровать файлы, которые в данный момент изменены (может ли это быть обработано временным файлом, который содержит git diff...
результат?)
1 ответ
У меня есть несколько рабочий подход. Я решил изменить webpack.base.conf.js
вместо того, чтобы использовать решение командной строки, чтобы использовать уже существующий загрузчик с заменой строк.
Файлы собраны в WebpackBeforeBuildPlugin
функция обратного вызова и вместо тестовой переменной на основе регулярных выражений используется функция, которая проверяет ранее собранные файлы.
const exec = require('child_process').exec;
const WebpackBeforeBuildPlugin = require('before-build-webpack');
var modFilesList = new Set([]);
const srcPath = resolve('.');
...
rules: [{
test: function(filename) {
let relFilename = path.relative(srcPath, filename);
let lint = modFilesList.has(relFilename);
return lint
},
loader: 'eslint-loader',
include: resolve('src'),
exclude: /node_modules/,
options: {
formatter: require('eslint-friendly-formatter'),
cache: false
}
}, {
... other string replacement loader ...
}
plugins: [
...
new WebpackBeforeBuildPlugin(function(stats, callback) {
// Collect changed files before building.
let gitCmd = 'git diff --name-only --relative | grep -E ".*\\.(vue|js)$"';
const proc = exec(gitCmd, (error, stdout, stderr) => {
if (stdout) {
let files = stdout.split('\n');
modFilesList = new Set(files);
}
if (error !== null) {
console.log(`exec error: ${error}`);
}
});
callback();
})
]
Единственная проблема на данный момент заключается в том, что когда происходят изменения в git-файле, они не запускают повторное связывание на основе этих изменений файла (т. Е. Новый файл изменяется или ранее (до запуска webpack-dev-server) измененные изменения файла отбрасывают). Я проверил все, что мог. Изменение зарегистрировано и хранится в modFilesList
, тестовая функция выполняется и возвращает true (для нового изменения в ранее неизмененном файле) или false, если изменение было отменено. Я также играл с cache
опция безрезультатна. Кажется, что при начальной загрузке, eslint-loader
кэширует файлы, которые он будет хранить в будущем (не знаю, является ли это результатом использования тестовой функции вместо регулярного выражения или также в случае с регулярным выражением). Кто-нибудь имеет идею или видел это раньше (eslint-loader не обновляет список файлов)?
Обновить
Похоже, это проблема веб-пакета (или одного из других загрузчиков), так как загрузчик eslint даже не запускается при изменении файла. test
Функция, однако, выполняется, что немного странно. Я не совсем понимаю, как работают загрузчики или как они играют вместе, так что может быть какой-то другой загрузчик, который вызывает это...