2014-05-02 157 views
1

我在安裝Node.js的Inno Setup中編寫安裝程序,提取包含所有節點項目文件的zip文件,然後需要使用npm install安裝節點應用程序。如何從Inno Setup調用「npm install」?

手動過程包括打開一個命令,瀏覽到這些文件的目錄(在我的情況中提取與{app}文件夾設置對應其程序文件夾),然後運行確切命令行npm install --quiet。然而,在Inno Setup的執行此操作時,它失敗...

function InstallNodeApp: Integer; 
var 
    C: String; 
begin 
    C:= 'npm install --quiet'; 
    if not Exec(C, '', ExpandConstant('{app}'), SW_SHOWNORMAL, ewWaitUntilTerminated, Result) then begin 
    Result:= -1; 
    end; 
end; 

我試圖把在參數--quiet以及調用cmd.exe使用此命令行參數,並嘗試多種組合方式,但沒有任何工作 - 執行失敗。我得到的錯誤始終是The system cannot find the file specified.

如何在接收結果/退出代碼時執行此節點安裝?

+0

假設'npm'是可執行文件,你應該寫類似'Exec的( '故宮', '安裝--quiet',ExpandConstant( '{}應用'),SW_SHOWNORMAL,ewWaitUntilTerminated,結果) ',其中'npm'預計可以在'{app}'文件夾或例如路徑由'PATH'環境變量註冊。 – TLama

+0

@TLama'npm'不是可執行文件,這就是爲什麼我無法工作。至少它不是這個文件夾中的可執行文件。我對「Node.js」和「npm」一無所知,但我試圖用Inno Setup複製命令行中的內容。 –

+0

請注意,命令提示符使用Windows Shell,因此它不僅可以運行可執行文件(例如批處理文件)。話雖如此,更接近的是Inno Setup中的ShellExec功能。當然,我可以告訴,如果'npm'不是可執行文件,使用'ShellExec'函數。 – TLama

回答

2

問題是我使用的是Exec,但由於npm的性質,它需要使用shell命令。相反,正如TLama在評論中提到的那樣,我使用了ShellExec,並且一切都很成功。

function InstallNodeApp: Integer; 
var 
    C, P, D: String; 
begin 
    C:= 'npm'; 
    P:= 'install --silent'; 
    D:= ExpandConstant('{app}'); 
    if not ShellExec('', C, P, D, SW_HIDE, ewWaitUntilTerminated, Result) then begin 
    Result:= -1; 
    end; 
end;