Как npm публиковать определенную папку, но как корневой каталог

У меня есть проект, который включает задачу gulp для создания и упаковки источников и выпуска в каталоге с именем dist. Моя цель - опубликовать его как пакет npm, но только мою папку dist. npm documentation говорит, что я могу использовать тег files для указания экспортируемых файлов. Оно работает. Но в документации также говорится, что:

Если вы укажете папку в массиве, то она также будет содержать файлы внутри этой папки

Результат, это пакет npm, который выглядит как node_modules:

сгенерированный пакет npm

Но я хотел бы видеть все мои файлы в корневом каталоге пакета (без этой папки dist). Мой файл index.js находится внутри папки dist, но должен находиться в корне. Я попытался установить тег files как /dist/**/*, но он не сработал.

Как я могу это достичь?

Ответ 1

У меня такое же желание, но я думаю, что нет никакого способа сделать это, используя только инструменты npm. Другой скрипт/инструмент может быть использован для организации вашего пакета.

Альтернативное решение

В настоящее время я копирую свой package.json в папку dist а затем запускаю npm pack внутри папки dist. Я думаю, что это, по сути, обеспечивает желаемое расположение нашего пакета.

Вот некоторые важные чтения по этому проекту npm: Почему нет Directories.lib в Node.

Также интересно отметить, что jspm ДОЛЖЕН уважать опцию directories.lib в package.json и переупорядочивать файлы при разрешении пакета npm. Все это произошло для меня, потому что я хочу создать общую библиотеку, которая может быть использована jspm или npm/webpack.

Ответ 2

Если в вашем проекте есть git, вы можете использовать небольшой хак. Добавьте следующие скрипты в package.json

    "prepublishOnly": "npm run build && cp -r ./lib/* . && rm -rf ./lib",
    "postpublish": "git clean -fd",

Теперь, когда вы запускаете команду publish npm, задействуйте prepublishOnly. Он создает файлы и сохраняет их в папке lib (сценарий сборки зависит от вашего проекта). Следующая команда копирует файлы в корневую папку и удаляет lib. После публикации скрипт postpublish возвращает проект в предыдущее состояние.

Ответ 3

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

https://docs.npmjs.com/misc/developers#keeping-files-out-of-your-package

Пример:

#tests
test
coverage

#build tools
.travis.yml
.jenkins.yml
.codeclimate.yml

#linters
.jscsrc
.jshintrc
.eslintrc*

#editor settings
.idea
.editorconfig

Update:

Если вы хотите разделить свой код на разные пакеты npm с использованием одного и того же репо, я недавно наткнулся на этот проект: Lerna и выглядит действительно хорошо.

Возможно, вам стоит взглянуть на

Ответ 4

Это прекрасно работает для меня.

CD TMPDIR; npm pack/path/to/package.json

Tarball создаст внутри каталога TMPDIR.

Ответ 5

У меня похожая проблема с оригинальным постером (@robsonrosa). В моем случае я использую typecript, который компилируется в каталог dist. Несмотря на то, что я могу скомпилировать машинописный текст в корневой каталог, я думаю, что лучшее решение - создать отдельный файл package.json в каталоге dist.
Это похоже на предложение @scvnc о копировании package.json, но с изюминкой:

В рамках процесса упаковки вы должны сгенерировать package.json для пакета, который основан на основном файле package.json в корневом каталоге, но отличается от него

Обоснование:

  • Корневой файл package.json является файлом разработки. Он может содержать сценарии или зависимости для разработки, которые бесполезны для пользователя пакета, но могут представлять для вас проблемы безопасности. Ваша процедура упаковки может включать код, который удаляет эту информацию из производства package.json.
  • Возможно, вы захотите развернуть свой пакет в разных средах, для которых могут потребоваться разные файлы пакета (например, вам могут потребоваться разные версии или зависимости).

Ответ 6

Вот еще один подход, который я считаю самым чистым. Вся конфигурация основана на необходимости перемещения файлов или указания путей в сценариях сборки и упаковки:

package.json Укажите основной файл.

{
    "main": "lib/index.js",
}

Некоторые дополнительные параметры машинописи:

  • Укажите rootDir. В этом каталоге будет весь исходный код, и в нем должен быть файл index (или какой-то другой файл, который вы можете использовать в качестве основного в package.json).
  • Укажите outDir. Здесь ваша команда tsc будет собираться в

tsconfig.json

{
    "compilerOptions": {
        "rootDir": "src",
        "outDir": "lib",
    },
    ...

}