2017-01-03 3 views
3

나는 purescript와 haskell (그리고 자바 스크립트와 노드까지)에 익숙하지 않기 때문에, 나는 purescript에서 자식 프로세스의 결과를 저장하는 방법을 알아내는 데 어려움을 겪고있다. purescript-node-childprocess 및 purescript-node-fs 모듈을 사용하고 있습니다.purescript에서 하위 프로세스의 출력을 캡처하는 방법은 무엇입니까?

위 내 댓글에 나타낸 바와 같이
import Node.ChildProcess (CHILD_PROCESS, SpawnOptions, defaultSpawnOptions, Exit(..), spawn, onExit, stdout) 
import Node.Stream (onData) 

type CPEffect = forall e 
       . Eff (cp :: CHILD_PROCESS 
        , console :: CONSOLE 
        , err :: EXCEPTION 
        , buffer :: BUFFER | e 
        ) Unit 

-- | Basically a wrapper around the spawn command. 
-- | Takes a command, an array of arguments, and a record of 
-- | options to pass to spawn. 
launch :: String -> Array String -> SpawnOptions -> CPEffect 
launch cmd args opts = do 
    cmd' <- spawn cmd args opts 
    onExit cmd' defaultExitHdlr 
    -- My problem is with onData due to its return type 
    onData (stdout cmd') -- what do I put as the callback handler arg? 
    log $ "done with " <> cmd 

이 문제가 Node.Stream 모듈에서 오는으로 onData 기능입니다 : 기본적으로, 나는 데 문제는 이것이다. 어떻게 자식 프로세스 출력을 저장할 수 있습니다, 반환 이후

onData :: forall w eff 
     . Readable w (err :: EXCEPTION | eff) 
     -> (Buffer -> Eff (err :: EXCEPTION | eff) Unit) 
     -> Eff (err :: EXCEPTION | eff) Unit 

단위를 반환하는 EFF의입니다 : 문제 유형 2 인수에 반환? 두 번째 인수는 Buffer를 취하고 같은 유형을 반환하는 함수입니다. 실제로, Readable (자식 프로세스의 stdout)에서 데이터를 가져 오는 것은이 함수입니다. 즉, 첫 번째 인수는 하위 프로세스의 노드에서 stdout 스트림이고 두 번째 인수는 stdout 스트림에서 버퍼를 채울 콜백 핸들러입니다.

그러나 콜백 처리기가 Unit을 반환하므로 하위 프로세스의 출력을 누적 할 수있는 방법이 표시되지 않습니다. 나는 아직도 Monad Transformers를 배우는 중이다. 그래서 이것은 해결책인가? 어떻게 든 이것을 감싸는 Writer 모나드를 만들 수 있습니까?

답변

3

FFI를 사용하지 않고 purescript에서이 작업을 수행하려는 경우 Ref를 사용하고 onData 콜백에서 ref 값을 읽고 ref 값에 새 데이터를 추가하여 새 문자열을 만들고 이 새로운 문자열로 ref 값을 업데이트하십시오.

WriterT는 콜백 함수가 Eff를 사용하기 때문에 형식을 정렬하는 방법을 알아 내기가 다소 번거롭기 때문에 실제로이 특수한 경우에는 사용하지 않지만이 유형의 개체에 유용합니다. WriterT가 아닌 Eff.

펄프에서이 정확한 문제를 해결하는 데 사용했던 또 다른 옵션은 npm 패키지 concat-stream을 사용하는 것입니다. 실제로 펄프가 이러한 라이브러리를 사용하는 실제 사례로 유용 할 수 있습니다. Pulp.Exec 및 Pulp.System.Stream 모듈이 관심있는 대상이라고 생각합니다.

+0

감사합니다. hdgarrood에게 감사 드리며,이 작업이 어떻게 수행되었는지 확인하겠습니다. 나는 기존 모듈의 소스 코드를 보면서 대부분의 purescript를 배우고있다. –

1

pscid 내가 사용하고 있습니다. 프로세스의 출력을 연결하고 프로세스가 종료 될 때 그 결과를 콘솔에 출력하는 STREF. 관련 코드를 복사하여 예제를 얻었습니다.