2012-05-10 30 views
6

Zauważyłem, że próbując uzyskać pozornie proste pakiety węzłów do zainstalowania z npm (np. nerve, "mikro-framework") często napotykam na pewien rodzaj bólu zależności. Po kilku kopaniu, wyśledziłem problem z nerwem do modułu bcrypt, który jest najwyraźniej napisany w C/C++ i musi zostać skompilowany po pobraniu go przez menedżera pakietów.Node.js/npm - czy mimo to stwierdzić, czy pakiet jest czystym JS czy nie?

Niestety, wygląda na to, że jeśli chcesz, aby to działało w systemie Windows, odpowiedzią jest (z jednego z wątków problemów bcrypt) "zainstaluj maszynę wirtualną Linux". Więc wcześniej zrobiłem to, i zacząłem działać w innych zależnościach (musisz zainstalować certain unnamed apt packages, zanim będziesz mógł pomyśleć o budowaniu, pomimo zainstalowania GCC), a następnie po zobaczeniu kolejnego błędu kompilatora C (o jakimś pakiecie lub innym nie będącym jestem w stanie znaleźć "Arrays.c", tak myślę), faktycznie zrezygnowałem i przełączyłem się z nerwu, by wyrazić zamiast tego. Jak na ironię, większe i bardziej skomplikowane ekspresowe instalacje z npm na Linux i Windows bez jednego problemu.

Moje pytanie brzmi: czy istnieje dostępne śledzenie filtra/zależności, które pozwala sprawdzić, czy pakiet ma dodatkowe zależności oprócz jądra węzła? Ponieważ dla mnie urok węzła to "wszystko w JavaScript", a tego rodzaju rzeczy rozpraszają iluzję dość nieprzyjemnie. W rzeczywistości, mimo że pracowałem więcej niż w C/C++, ilekroć widzę wymóg "zrobienia" czegoś w tych dniach, generalnie biegam w przeciwnym kierunku, krzycząc. :)

+1

Czuję twój ból Dave, ale czasami jesteśmy zmuszeni do c/C++ przez optymalizację i zapotrzebowanie na zasoby.Po pracy nad kilkoma natywnymi modułami węzła i próbach nie powtarzania czegokolwiek i używania rozsądnych zależności, natknąłem się na szereg problemów. Być może najbardziej racjonalne moduły węzłów to te, które wywołują lub wykonują natywny kod, a nie kompilują go i łączą z nim. –

Odpowiedz

4

Zwróć uwagę na pole "skrypty" w pliku package.json.

Jeśli zawiera coś podobnego

"scripts": { 
    "install": "make build", 
} 

i Makefile w katalogu głównym, istnieje duża możliwość, że pakiet ma jakiś rodzimy moduł, który miałby zostać opracowany i zbudowany. Wiele pakietów zawiera plik Makefile tylko do kompilacji testów.

To sprawdzenie dokumentów pakietu nie wyklucza, że ​​niektóre zależności będą musiały zostać skompilowane i zbudowane. Oznaczałoby to powtórzenie tego procesu dla każdej zależności w pakiecie.json, ich zależności i tak dalej.

To, że wiele modułów zostało zaktualizowanych do zainstalowania, bez kompilacji w systemie Windows, wyrażają się za jednym. Jednak nie można zagwarantować wszystkich pakietów.

Używanie maszyny wirtualnej Linux wydaje się być najlepszą alternatywą. Developing Node.js applications on Window zawiera instrukcje krok po kroku dotyczące instalowania VM, Node.js i Express.

2

Węzeł nie jest "wszystko javascript", ponieważ jednym ze sposobów rozszerzenia rdzenia węzła jest napisanie wtyczek c/C++.

Węzeł jest bardziej wrapper javascript wokół modułów c/C++ za pomocą V8.

Jak można na przykład napisać wydajne sterowniki baz danych w czystym javascriptie? byłoby to możliwe, ale powolne.

co do filtrów, to do autora należy dokumentacja jego paczki. nie ma automatycznego filtra.

+1

Masz na myśli https://github.com/felixge/node-mysql? – Dave

+0

Tak jak powiedziałem, jest to możliwe (zapisywanie czystych sterowników baz danych js), ale czy faktycznie przetestowałeś pakiet? Zrobiłem . – mpm

+3

Właśnie znalazłem tę stronę porównawczą porównującą czyste implementacje JS z wersją libmysql: https://github.com/Sannis/node-mysql-bindings-benchmarks/wiki Wygląda jak https://github.com/sidorares/ nodejs-mysql-native jest tak samo szybki jak ten, który łączy się z biblioteką mysql. Wcale mnie to nie dziwi - na pewno wąskimi gardłami dla tego typu rzeczy będzie procesor/I/O, a nie sam klient? – Dave

7

Pierwsze rozwiązanie nie mówi, czy zależność sprawia, że ​​pakiet jest nieczysty, czy nie. Znacznie lepiej jest wyszukać generację Gyp:

find node_modules/ | grep binding.gyp || echo pure 
+0

Tak, daje odpowiedź, w tym przypadku jest nawet poprawna w przeciwieństwie do pierwszej odpowiedzi. Nie można powiedzieć z "make build", co to robi. Może zbudować coś, co nie jest czystym skryptem, ale może nie. Ta odpowiedź również nie sprawdza żadnej zależności. Jedyną poprawną odpowiedzią jest wyszukanie jakiegokolwiek dowodu węzła-gypu, który polega na budowaniu wszystkiego, co nieczyste. –

Powiązane problemy