`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 --
Если вы хотите попробовать сами:
- клонировать репозиторий
cd common/contracts/rust
cargo build
(вам нужно будет установить Rust)cd ../../..
npm pack --dryrun
Работает ли это для вас? Это вещь "сломана только на моей машине"?
1 ответ
"Это что," сломано только на моей машине "?"
Нет, это (почти) ожидаемое поведение, учитывая текущую конфигурацию ваших проектов - и ни один npm не кэширует.npmignore
файл где-нибудь.
Причина, по которой я сказал "почти" ранее, заключается в том, что в своем последнем комментарии вы сказали:
"Итак, в этом случае все пути в
templates/*
игнорируются, но пути вcommon/contracts
входят в комплект ".
Этого не должно быть, потому что в соответствии с ожидаемым поведением npm, как указано в документации (см. Раздел "Почему это происходит?" Ниже), ни один из шаблонов, указанных в настоящее время в вашем файле .npmignore, не должен быть эффективным для вашего текущего пакета. json 'sfiles
конфигурация.
Вы сталкиваетесь со странным поведением, т.е. одни шаблоны соблюдаются, а другие нет, однако, надеюсь, следуя одному из двух предложенных решений / подходов (ниже), вы получите правильный желаемый результат.
Почему это происходит?
Документы для package.json "с files
В поле указано следующее, имеющее отношение к вашей проблеме:
Примечание: выделено мной жирным шрифтом.
Вы также можете предоставить
.npmignore
файл в корне вашего пакета или в подкаталогах, что предотвратит включение файлов. В корне вашего пакета он не переопределит поле "файлы", но в подкаталогах это будет.
Таким образом, причина, почему модели в настоящее время, указанные в вашем .npmignore файл НЕ игнорируются, потому что они пытаются переопределить шаблоны включения в настоящее время, указанные в вашем package.json "sfiles
поле. По сути, поскольку ваш файл .npmignore в настоящее время находится в корне вашего пакета, он не будет перекрывать поле "файлы".
Решения
Вот два разных решения / метода, которые следует рассмотреть (они расположены в произвольном порядке):
Опустить
files
запись из package.json и при необходимости дополните текущий файл .npmignoreт.е. удалите это из package.json:
"файлы": [ "/ общий", "/ шаблоны" ],Затем создайте дополнительные шаблоны в вашем текущем файле .npmignore для любых других каталогов / файлов, которые также следует исключить из упаковки / публикации. Другими словами, добавьте любые шаблоны в .npmignore для активов, которые не находятся где-то в
/common
или/templates
это также следует исключить.Например, после беглого просмотра вашего репо вам нужно добавить шаблон
tests
в .npmignore тоже.Таким образом, этот первый подход представляет собой случай удаления
files
и укажите все шаблоны игнорируемых активов в одном месте - в поле.npmignore
файл в корне вашего проекта.Или оставьте
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 ", но в подкаталогах это будет ", тогда вам необходимо:
Создайте файл .npmignore в
common/contracts/
каталог, содержащий следующие шаблоны:rust/target out
Создайте файл .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, которые у вас есть в дереве каталогов, а не только в корне.. " .