Как сделать реакцию родного упаковщика игнорировать определенные каталоги

Проблема:

Мой проект имеет @providesModule naming collision при попытке запустить react-native run-ios из командной строки. Он конфликтует с автогенерированным dir dist/, который создается другим пакетом npm, esdoc. Я хотел бы иметь возможность сохранить этот автогенерированный каталог и просто заставить реагировать на собственный упаковщик игнорировать директорию dist/.

Сообщение об ошибке:

[01/23/2017, 13:17:07] <START> Building Haste Map
    Failed to build DependencyGraph: @providesModule naming collision:
      Duplicate module name: ann
      Paths: /Users/thurt/projects/example/package.json collides with /Users/thurt/projects/example/dist/esdoc/package.json

This error is caused by a @providesModule declaration with the same name across two different files.
Error: @providesModule naming collision:
  Duplicate module name: ann
  Paths: /Users/thurt/projects/example/package.json collides with /Users/thurt/projects/example/dist/esdoc/package.json

This error is caused by a @providesModule declaration with the same name across two different files.
    at HasteMap._updateHasteMap (/Users/thurt/projects/example/node_modules/react-native/packager/react-packager/src/node-haste/DependencyGraph/HasteMap.js:158:13)
    at p.getName.then.name (/Users/thurt/projects/example/node_modules/react-native/packager/react-packager/src/node-haste/DependencyGraph/HasteMap.js:133:31)

Ответ 1

Конфигурация для этого имеет обыкновение изменяться между версиями RN. Ниже приведены инструкции по созданию файла конфигурации, загрузке файла конфигурации и очистке кэша.

Для React Native> = 0,59

В корне вашего проекта создайте metro.config.js с содержимым:

const blacklist = require('metro-config/src/defaults/blacklist');

// blacklist is a function that takes an array of regexes and combines
// them with the default blacklist to return a single regex.

module.exports = {
  resolver: {
    blacklistRE: blacklist([/dist\/.*/])
  }
};

Для React Native> = 0,57, <0,59

В корне вашего проекта создайте rn-cli.config.js с содержанием:

const blacklist = require('metro-config/src/defaults/blacklist');

// blacklist is a function that takes an array of regexes and combines
// them with the default blacklist to return a single regex.

module.exports = {
  resolver: {
    blacklistRE: blacklist([/dist\/.*/])
  }
};

Для React Native> = 0,52, <0,57

В корне вашего проекта создайте rn-cli.config.js с содержанием:

const blacklist = require('metro').createBlacklist;

module.exports = {
  getBlacklistRE: function() {
    return blacklist([/dist\/.*/]);
  }
};

Для React Native> = 0,46, <0,52.

В корне вашего проекта создайте rn-cli.config.js с содержанием:

const blacklist = require('metro-bundler').createBlacklist;

module.exports = {
  getBlacklistRE: function() {
    return blacklist([/dist\/.*/]);
  }
};

Для React Native <0,46.

В корне вашего проекта создайте rn-cli.config.js с содержанием:

const blacklist = require('react-native/packager/blacklist');

module.exports = {
  getBlacklistRE: function() {
    return blacklist([/dist\/.*/]);
  }
};

Все версии <0.59

Пусть ваша команда CLI использует эту конфигурацию, передав --config:

react-native run-ios --config=rn-cli.config.js

(Файл конфигурации должен автоматически выбираться с помощью RN> = 0,59, с тех пор как он был переименован в metro.config.js)

Все версии: Примечание по кешированию

Имейте в виду, что ваши занесенные в черный список элементы, возможно, уже были включены в кэш упаковщиком; в этом случае при первом запуске упаковщика с черным списком может потребоваться сброс кеша с помощью --reset-cache