2016-08-19 56 views
6

Czy mogę zmienić katalog główny mojego pakietu Node.js npm, kiedy robię publikację? Co mam jest następujący:Zmień katalog główny na npm publish

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

W /src wszystko mojego kodu źródłowego ES2015. Przenoszę to z Babel do mojego katalogu /lib. main w moim package.json wskazuje na lib/index.js. Następnie mogę utworzyć npm publish (mój .npmignore jest ustawiony na src, więc zostanie opublikowany tylko lib). Teraz mój pakiet jest wdrażany na stronie npmjs.com, aw innym pakiecie mogę go zaimportować za pomocą import index from 'mypackage'.

Jak dotąd tak dobrze. Ale co jeśli chcę zaimportować sub/mymodule.js bezpośrednio? Muszę napisać: import mymodule from 'mypackage/lib/sub/mymodule'. To, czego naprawdę chcę, to import mymodule from 'mypackage/sub/mymodule' bez /lib/ na mojej ścieżce.

Jak mogę to osiągnąć? Dokumentacja npm o nazwie directories.lib, którą mogę ustawić w package.json, ale wygląda na to, że zostanie całkowicie zignorowana. Ustawiłem to na ./lib, ale nic nie robi.

Odpowiedz

2

Możesz opublikować swój katalog /lib zamiast z npm publish lib. Pamiętaj, aby skopiować plik package.json do katalogu lib przed opublikowaniem.

Sugestia jest użycie skryptów NPM:

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

+2

Tak, dziękuję, ale jest to bardzo brzydki i podatny na błędy sposób obejścia tego problemu, ponieważ musisz przejść do '/ lib' i zrobić' zenddom 'z tego katalogu. Wyobraź sobie, że zapomniałeś tego kroku i zrobiłeś 'npm publish' przypadkowo z katalogu głównego twojego projektu. Kończysz w bibliotece, która już nie działa. – LongFlick

+1

Natknąłem się na ten komentarz dzisiaj i zorientowałem się, że możesz ustawić 'private: true' w' pakiet.json', który zapobiega wszystkim próbom publikowania. następnie w twoim katalogu '/ lib', upewnij się, że powinieneś pominąć' private: true' podczas kopiowania 'pakiet.json', to ogranicza ci publikowanie tylko w twoim przygotowanym katalogu. – Javran

2

ja też zostały przeżywa dokładnie ten sam ból. Po dużo zabawy skończyło się z odpowiedzią na podstawie jednego w tym poście:

"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" 
} 

Oznacza to, że „npm publikuje” nie powiedzie się, gdy nie jest w katalogu lib, który zapobiega błędnym wdrożeń. Nie chcę używać niestandardowego "npm run pub", ale jest to najlepsze rozwiązanie, na które udało mi się teraz wymyślić.

+0

Ugh - Miałem nadzieję znaleźć lepszą odpowiedź niż to. Robię to samo. Naprawdę nie przeszkadza mi to, że "npm publish" nie działa, jeśli robię to ręcznie z cli, ale problem polega na tym, że mam specjalny przypadek dla wszystkich naszych narzędzi do kompilacji, które są automatycznie publikowane. Nie mogę po prostu założyć, że "npm publish" to sposób, w jaki publikujesz pakiet. –