`npm publish` игнорирует новые дополнения к .npmignore

При строительстве create-near-app, артефакты создаются в дереве проекта. Некоторые из них были добавлены в.npmignoreфайл, но другие были пропущены, пока я не попытался опубликовать новую версию и не заметил, что размер пакета npm будет несколько сотен мегабайт (!!) из-за артефактов сборки Rust. Я добавил это в.npmignore, но npm publish не замечает.

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

Кэширует ли npm .npmignoreфайл где-нибудь? Как заставить npm использовать новые настройки?


Подробная информация и краткая справка:

ОС: macOS 10.15.6
менеджер версий узлов: asdf v0.7.6
узел: v12.14.1
npm: v6.13.7

package.json:

-- snip --
"files": [
  "/common",
  "/templates"
],
-- snip --

.npmignore:

common/contracts/rust/target
common/contracts/out
templates/*/.cache
templates/*/assembly
-- snip --

выход npm pack --dryrun:

-- snip --
npm notice 293.2kB common/contracts/rust/target/debug/build/ryu-140fa0ad757694f9/build_script_build-140fa0ad757694f9                                                                           
npm notice 20.6kB  common/contracts/rust/target/debug/build/ryu-140fa0ad757694f9/build_script_build-140fa0ad757694f9.dSYM/Contents/Resources/DWARF/build_script_build-140fa0ad757694f9         
npm notice 297.4kB common/contracts/rust/target/debug/build/serde-3bef95b74f70906a/build_script_build-3bef95b74f70906a                                                                         
-- snip --

Если вы хотите попробовать сами:

  1. клонировать репозиторий
  2. cd common/contracts/rust
  3. cargo build(вам нужно будет установить Rust)
  4. cd ../../..
  5. npm pack --dryrun

Работает ли это для вас? Это вещь "сломана только на моей машине"?

1 ответ

"Это что," сломано только на моей машине "?"

Нет, это (почти) ожидаемое поведение, учитывая текущую конфигурацию ваших проектов - и ни один npm не кэширует.npmignore файл где-нибудь.

Причина, по которой я сказал "почти" ранее, заключается в том, что в своем последнем комментарии вы сказали:

"Итак, в этом случае все пути в templates/* игнорируются, но пути в common/contracts входят в комплект ".

Этого не должно быть, потому что в соответствии с ожидаемым поведением npm, как указано в документации (см. Раздел "Почему это происходит?" Ниже), ни один из шаблонов, указанных в настоящее время в вашем файле .npmignore, не должен быть эффективным для вашего текущего пакета. json 'sfiles конфигурация.

Вы сталкиваетесь со странным поведением, т.е. одни шаблоны соблюдаются, а другие нет, однако, надеюсь, следуя одному из двух предложенных решений / подходов (ниже), вы получите правильный желаемый результат.


Почему это происходит?

Документы для package.jsonfiles В поле указано следующее, имеющее отношение к вашей проблеме:

Примечание: выделено мной жирным шрифтом.

Вы также можете предоставить .npmignoreфайл в корне вашего пакета или в подкаталогах, что предотвратит включение файлов. В корне вашего пакета он не переопределит поле "файлы", но в подкаталогах это будет.

Таким образом, причина, почему модели в настоящее время, указанные в вашем .npmignore файл НЕ игнорируются, потому что они пытаются переопределить шаблоны включения в настоящее время, указанные в вашем package.json "sfilesполе. По сути, поскольку ваш файл .npmignore в настоящее время находится в корне вашего пакета, он не будет перекрывать поле "файлы".


Решения

Вот два разных решения / метода, которые следует рассмотреть (они расположены в произвольном порядке):

  1. Опустить filesзапись из package.json и при необходимости дополните текущий файл .npmignore

    т.е. удалите это из package.json:

    "файлы": [
     "/ общий",
     "/ шаблоны"
    ],

    Затем создайте дополнительные шаблоны в вашем текущем файле .npmignore для любых других каталогов / файлов, которые также следует исключить из упаковки / публикации. Другими словами, добавьте любые шаблоны в .npmignore для активов, которые не находятся где-то в/common или /templates это также следует исключить.

    Например, после беглого просмотра вашего репо вам нужно добавить шаблон testsв .npmignore тоже.

    Таким образом, этот первый подход представляет собой случай удаления files и укажите все шаблоны игнорируемых активов в одном месте - в поле .npmignore файл в корне вашего проекта.

  2. Или оставьте filesзапись в package.json как есть и создание дополнительных файлов .npmignore в подкаталогах

    Учитывая шаблоны, которые в настоящее время указаны в вашем файле .npmignore:

    common/contracts/rust/target
    common/contracts/out
    templates/*/.cache
    templates/*/assembly
    templates/*/contract
    templates/*/package.json
    templates/*/src/assets
    templates/*/src/config.js
    templates/*/src/global.css
    templates/*/src/utils.js
    

    а также учитывая, что в документации указано; "в корне вашего пакета [.npmignore] не будет отменять поле" files ", но в подкаталогах это будет ", тогда вам необходимо:

    1. Создайте файл .npmignore вcommon/contracts/ каталог, содержащий следующие шаблоны:

      rust/target
      out
      
    2. Создайте файл .npmignore вtemplates/ каталог, содержащий следующие шаблоны:

      */.cache
      */assembly
      */contract
      */package.json
      */src/assets
      */src/config.js
      */src/global.css
      */src/utils.js
      

    В .npmignore файл, который в настоящее время находится в корне каталога вашего проекта (как есть), становится избыточным при использовании этого второго метода.


Примечание. Надеемся, что, следуя одному из двух вышеупомянутых решений / методов (которые точно соответствуют задокументированным ожиданиям npm), вы получите желаемый результат. Однако, если ни одно из этих предложенных решений не дает желаемого результата, я предлагаю сохранить одно из предлагаемых решений в качестве базовой отправной точки, а затем прочитать некоторые ответы в этой теме SO. Да, вопрос противоположен вашей проблеме, однако вы можете получить более подробное представление о следующих шагах, особенно из этого ответа - он упоминает "npm pack и публиковать с учетом любых файлов package.json, которые у вас есть в дереве каталогов, а не только в корне.. " .


Другие вопросы по тегам