Должен ли я .npmignore мои тесты?

Что именно я должен указать в .npmignore?

Тесты? Такие вещи, как .travis.yml, .jshintrc? Что-нибудь, что не нужно при запуске модуля (кроме ридми)?

Я не могу найти никакого руководства по этому поводу.


person callum    schedule 04.08.2014    source источник
comment
следует игнорировать все, что не нужно, когда кто-то звонит npm install yourlibrary, например .travis.yml и .jshintrc   -  person lante    schedule 04.08.2014
comment
В самом деле? хотя бы ридми? это нигде официально не рекомендуется?   -  person callum    schedule 04.08.2014
comment
README включается автоматически независимо от .npmignore или "files" (docs.npmjs.com/files/package. json#файлы).   -  person Nicolás Fantone    schedule 25.01.2018


Ответы (4)


Как вы, вероятно, заметили, NPM на самом деле не указывает конкретно, что там должно быть, скорее у них есть список игнорируемых по умолчанию файлов. Многие люди даже не используют его, поскольку все в вашем .gitignore по умолчанию игнорируется в npm, если .npmignore не существует. Кроме того, многие файлы уже игнорируются по умолчанию независимо от настроек, а некоторые файлы всегда исключаются из игнорирования, как указано в приведенной выше ссылке.

Официально не так много информации о том, что всегда должно быть там, потому что это в основном подмножество .gitignore, но из того, что я понял из использования узла в течение 5 лет, вот что я придумал.

Примечание. Под производством я подразумеваю любое время, когда ваш модуль используется кем-то, а не для разработки самого модуля.


Предварительные кросс-компилированные исходники

  • Плюсы: если вы используете язык, который выполняет кросс-компиляцию в JavaScript, вы можете выполнить предварительную компиляцию перед выпуском и не включать .coffee файлов в свой пакет, но продолжать отслеживать их в своем репозитории git.

Остатки файла сборки

  • Плюсы: люди, использующие такие вещи, как node-gyp, могут иметь объектные файлы, созданные во время сборки, которые никогда не должны быть включены в пакет.
  • Минусы: в любом случае это всегда должно идти в .gitignore. Вы должны разместить эти вещи здесь, если вы уже используете файл .npmignore, так как он переопределяет .gitignore с точки зрения npm.

Тесты

  • Плюсы: меньше багажа в производственном коде.
  • Минусы. Вы не можете запускать тесты в реальных средах из-за незначительной вероятности сбоя системы, например, устаревшей версии работающего узла, которая приводит к сбою теста.

Настройки непрерывной интеграции/метафайлы

  • Плюсы: опять же, меньше багажа. Такие вещи, как .travis.yml, не требуются для использования, тестирования или просмотра кода.

Документы без readme и примеры кода

  • Плюсы: меньше багажа. Некоторые люди придерживаются точки зрения, согласно которой, если вы не можете выразить хотя бы минимальную жизнеспособную функциональность в своем файле Readme, ваш модуль слишком велик.
  • Минусы: люди не могут просматривать исчерпывающую документацию и примеры кода в собственной файловой системе. Им придется посетить репозиторий (для чего также требуется подключение к Интернету).

Объекты Github-страниц

  • Плюсы: вам, конечно же, не нужно засорять свои выпуски CNAME файлами или заполнителями index.html, если вы используете свой модуль в качестве gh-pages репозитория.

Bower.json и друзья

  • Плюсы: если вы решите встроить свои зависимости до выпуска, вам не нужно, чтобы конечный пользователь устанавливал Bower, а затем устанавливал с ним дополнительные вещи. Лично я бы оставил эти вещи в упаковке. Когда я делаю npm install, я должен полагаться только на npm и никакие другие внешние источники.

По сути, вы всегда должны использовать его, если есть что-то, что вы хотите убрать из своего пакета npm, но не из своего репозитория npm. Это не длинный список элементов, но npm скорее встроит функциональность, чем заставит людей зацикливаться на ненужных объектах в своем пакете.

person SamT    schedule 04.08.2014
comment
Нет ли способа удалить неиспользуемые скрипты из файла package.json. Например. тестирование скриптов? Я чувствую себя немного грязно, чтобы удалить все, но сохранить сценарии в файле... - person inf3rno; 19.08.2016
comment
Нет, нет. Вы можете опустить их из package.json, так как это в первую очередь для NPM, и если вы только запускаете тесты, вы можете получить к ним доступ через исходную команду для их запуска. - person SamT; 19.08.2016

Я согласен с кратким и синтетическим ответом Ланте и Большой ответ SamT:

  • Вы не должны включать свои тесты в свой пакет.
  • Ваш пакет должен содержать только рабочие файлы среды выполнения.
  • Это сделает ваш пакет более простым и быстрым для загрузки.

Мой вклад в эти ответы:

.npmignore входит в черный список< /strong> способ добиться выбора файла пакета. Но более практичным способом является белый список файлов, которые необходимо включить в пакет используя поле файлов в вашем package.json:

{
  "files": [
    "lib/",
    "index.js"
  ]
}

Я думаю, что это проще, перспективнее и имеет лучшую семантику;)

person Yves M.    schedule 24.05.2016
comment
... не говоря уже о том, что его легче запомнить и с меньшей вероятностью использовать (если вы настолько забывчивы, насколько я могу быть). Спасибо за подсказку, это здорово. - person Connor; 17.07.2016
comment
Мне нравится этот подход. - person Brady Holt; 28.07.2016
comment
Я думаю, вы даже можете опустить index.js, предполагая, что это «основной» файл в вашем package.json :) - person Ben George; 03.05.2017
comment
Игнорирование изображений и ненужных документов — это нормально. Но игнорировать тесты, вероятно, не очень хорошая идея. Загрузка некоторых дополнительных КБ не занимает много времени, и выполнение рекурсивного npm test по всем node_modules может дать вам подсказку, работает ли что-то по-другому в определенной среде. - person adelriosantiago; 06.12.2017
comment
Я также предпочитаю этот подход .npmignore. Один недостаток, однако, заключается в том, что вы не можете игнорировать файлы, подпадающие под действие "files" на .npmignore. Некоторым людям нравится размещать тесты рядом с исходниками, поэтому, если ваши .test.js ниже lib/, вы не можете не упаковать их. - person Nicolás Fantone; 25.01.2018
comment
@NicolásFantone Свойство files также принимает шаблон glob. Таким образом, мы можем игнорировать тестовые файлы, не создавая .npmignore. files: ["lib", "!lib/**/*.test.js"]. :) - person Sureshraj; 30.12.2019
comment
Я обнаружил, что ответ, предоставленный @Sureshraj выше, является идеальным решением, если вы хотите поместить тестовые файлы рядом с исходным кодом, особенно если вы не используете инструмент сборки для компиляции в другой каталог. npm будет игнорировать .npmignore в каталоге верхнего уровня, а это означает, что вам нужно будет поместить его в каждый тестовый подкаталог, если они находятся рядом с исходным кодом. - person Brad Frost; 24.09.2020
comment
@Sureshraj Этот подход мне не подходит. Лучшая альтернатива, которую я мог придумать, — это полностью удалить "files" и использовать .npmignore для внесения в черный список всех файлов с помощью * и после этого добавить явные записи в белый список, например !index.js и !lib/**/!(*.test).js. - person Nicolás Fantone; 15.01.2021
comment
@NicolásFantone Не могли бы вы предоставить немного больше контекста? Я использовал предложенный подход в одном из моих проектов, и он просто отлично работает. - person Sureshraj; 16.01.2021
comment
Интересный. Я только что попробовал ваш репозиторий и действительно работал без проблем с npm pack. Придется проверить, почему я не смог заставить его работать на меня. В любом случае, я удалю свой предыдущий комментарий, чтобы через несколько дней он не смущал других. Спасибо! - person Nicolás Fantone; 18.01.2021

Просто чтобы уточнить, каждый раз, когда кто-то делает npm install your-library, npm загружает все исходные файлы, которые включены в репозиторий, за исключением файлов, которые вы включаете в свой .npmignore.

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

Например, когда кто-то устанавливает библиотеку, вероятно, ему/ей нет дела до ваших файлов .travis.yml или .jshintrc, или даже до каких-то изображений, файлов Grunt, документации и т. д.

.npmignore может позволить вашему пакету npm иметь меньше файлов и быстрее загружаться

person lante    schedule 04.08.2014
comment
Мнение здесь хорошее, но поясню: .npmignore не влияет напрямую на то, что загружается, оно влияет на то, что входит в ваш пакет, когда вы публикуете npm и загружаете. Это косвенно создает файлы меньшего размера для загрузки. - person Mark Stosberg; 22.06.2018

Не включайте свои тесты. Часто тесты примерно в 5 раз превышают размер фактической кодовой базы. Пока ваши тесты находятся на Github и т. д., этого достаточно.

Но вам абсолютно необходимо протестировать пакет NPM в его опубликованном формате. Создайте несколько дымовых тестов, которые находятся в фактической кодовой базе, но не являются частью набора тестов.

Вы можете прочитать о тестировании вашего пакета после его архивирования здесь: https://github.com/ORESoftware/r2g

Как протестировать `публикацию npm` результат без фактической публикации в NPM?

person Alexander Mills    schedule 27.06.2018