2016-08-19 2 views
6

Можно ли изменить корневую директорию моего пакета Node.js npm при публикации? Что у меня есть следующие:Изменить корневую директорию на npm publish

├── lib 
├── package.json 
├── .npmignore 
├── src 
│   ├── index.js 
│   └── sub 
│    └── mymodule.js 
└── test 

В /src все из моего источника ES2015 кода. Я переношу это с Babel в мой каталог /lib. main в моих package.json указывает на lib/index.js. После этого я могу сделать npm publish (мой .npmignore установлен в src, поэтому будет опубликован только lib). Теперь мой пакет развернут на npmjs.com, а в другом пакете я могу импортировать его с помощью import index from 'mypackage'.

Пока все хорошо. Но что, если я хочу напрямую импортировать sub/mymodule.js? Я должен написать import mymodule from 'mypackage/lib/sub/mymodule'. Я действительно хочу import mymodule from 'mypackage/sub/mymodule' без /lib/ на моем пути.

Как я могу это достичь? Документация npm упомянула directories.lib, что я могу установить в package.json, но, похоже, она будет полностью проигнорирована. Я установил его в ./lib, но он ничего не делает.

ответ

2

Вместо этого вы можете указать свой каталог /lib: npm publish lib. Не забудьте скопировать файл package.json в каталог lib перед публикацией.

Предложение заключается в использовании НПХ сценариев:

"scripts": { "build": "babel src --out-dir lib", "prepublish": "npm run build && cp ./package.json lib" }

+2

Да, спасибо, но это очень уродливое и подверженное ошибкам обходное решение для этого, потому что вам нужно записать cd в '/ lib' и сделать« npm publish »из этого каталога. Представьте, что вы забыли этот шаг и случайно сделали «npm publish» из корневого каталога вашего проекта. Вы попадаете в библиотеку, которая больше не работает. – LongFlick

+1

Сегодня я наткнулся на этот комментарий и понял, что вы можете установить 'private: true' в' package.json', что предотвращает все попытки публикации. затем в вашем каталоге '/ lib', обязательно скопируйте' private: true' при копировании 'package.json', это ограничит публикацию только в вашем подготовленном каталоге. – Javran

2

я тоже испытывал точно такую ​​же боль. После того, как много играть вокруг я закончил с ответом на основе одного в этой должности:

"scripts": { 
    "test": "echo \"Error: no test specified\" && exit 1", 
    "lint": "eslint src/**", 
    "build": "rm -rf ./lib/* && babel src -d lib -s && cp ./package.json lib", 
    "prepublish": "[[ \"$PWD\" =~ YOUR_DIR_HERE/lib ]]", 
    "pub": "pushd ./ && npm run build && cd lib && npm publish && popd" 
} 

Это означает, что «NPM публиковать» потерпит неудачу, если не в Lib директории, которая предотвращает ошибочные развертывания. Я не заинтересован в том, чтобы использовать пользовательский «npm run pub», но это лучшее решение, с которым я смог придумать.

+0

Ух - Я надеялся найти лучший ответ, чем это. Я делаю то же самое. Я действительно не против «npm publish», если я делаю это вручную из cli, но проблема в том, что теперь у меня есть специальный случай для всех наших инструментов сборки, которые публикуются автоматически. Я уже не могу просто предположить, что «npm publish» - это то, как вы публикуете пакет. –

Смежные вопросы