2015-01-05 25 views
9

Piszę Yeoman generator i za pomocą child_process.spawn() (poprzez Yeoman za spawnCommand() - patrz https://github.com/yeoman/generator/blob/master/lib/actions/spawn_command.js)Węzeł Proces dziecko tarło stdout powrocie za nieważną

Mój kod wygląda następująco:

var list = this.spawnCommand('npm', ['list', 'sails'], {stdio: 'pipe'}); 
list.stdout.on('data', /* callback here that wants to consume the command's output */); 

Widzę, że istnieje list.stdio i że ma on [0,1,2] jako klucze. Każda z nich ma wartość NULL (lub niezdefiniowaną). Oznacza to, rejestrowanie _.keys(list).join() wyjściowe ,,. list.stdout.on() podaje wyjątek stwierdzający, że stdout ma wartość null.

Co muszę zrobić, to sprawdzić, czy określone pakiety są zainstalowane i zobaczyć, jaki jest numer wersji. Ale później potrzebuję robić inne rzeczy, gdzie parsuję wyjście komend CLI (na przykład, wynik logu git), więc potrzebuję ogólnego rozwiązania. .spawn() wydaje się być tym, czego chcę, ale przykłady, które widziałem, wydają się wskazywać, że standardowe wyjście powinno być czymś, co ma metodę .on(). Na przykład ten podany tutaj: http://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options, gdzie wyświetla się uruchomiony ls -lh /usr.

Czy brakuje mi czegoś prostego? Zastanawiam się, czy uruchomione polecenie nie zwraca w ogóle żadnego wyjścia, jeśli oznacza to, że standardowe wyjście będzie miało wartość zerową. Jeśli tak jest, to po prostu muszę zidentyfikować polecenia, które mogą nie mieć wyjścia i po prostu sprawdzić, czy stdout nie jest pusty, zanim spróbuję go użyć.

edit faktycznie, wyjście listy poleceń NPM jest wyświetlane w wierszu polecenia, ale po sprawozdaniu z bali używałem do zdiagnozowania problemu (co bym umieścić po wywołaniu .spawnCommand() i przed wywołaniem .on(). Ale potrzebuję do niego dostępu w moim kodzie - pokazanie go w wierszu poleceń jest poza tym punktem (poza tym, że daje mi znać, że proces pomyślnie wykonał komendę CLI)

+0

Czy kiedykolwiek dowiedziałeś się, jaka była przyczyna? Teraz też szukam odpowiedzi. – Rondo

+0

Nie tak daleko :(przepraszam – jinglesthula

Odpowiedz

10

Po prostu wpadłem na to - przystań " t wyglądał zbyt głęboko w szczegółach, ale mogę powiedzieć, że ustawienie {stdio: 'whatever'} w opcji odradzania zapobiega odradzaniu się obiektu odrodzenia ze strumieni stdout i stderr - oba będą null.

Jeśli usuniesz tę opcję, będą pełnoprawnymi strumienie ponownie (i dostępne za pośrednictwem .on()

Od the docs you linked to, wygląda na to można ustawić stdio do istniejącego strumienia. - może to jest elastyczność szukasz?

+3

Czy istnieje sposób, aby ustawić '{stdio: 'dziedziczy lub cokolwiek'}' i mieć dostęp do strumieni 'stdout' /' stderr' dziecka? –

+0

@KennethWorden Na podstawie mojego zrozumienia dokumentów , 'pipe' jest tą opcją, ale pytanie OP wskazuje, że nie działa. Nie wiem dlaczego. –

0

Jeśli dziecko zostało zrodził z stdio zestaw do niczego innego niż «rury», a następnie subprocess.stdout będzie null.

Zobacz