Как мне запустить NPM из FAKE?

Важный:

Поскольку я подумал, что это то, что многие люди хотели бы сделать, я добавил в FAKE помощника, чтобы сделать это: http://fsharp.github.io/FAKE/apidocs/fake-npmhelper.html

Вопрос начинается здесь:

Я пытаюсь запустить NPM из Fake, но по какой-то причине это не сработает.

Моя фальшивая цель выглядит так:

Target "Web" (fun _ ->
  let result =
          ExecProcess (fun info ->
              info.FileName <- "npm.cmd"
              info.Arguments <- "install ./src/FAKESimple.Web/"
              info.WorkingDirectory <- "."
          ) (System.TimeSpan.FromMinutes 1.0)
  if result <> 0 then failwith "Operation failed or timed out"
  trace "Hello World from FAKE"
)

Я получаю сообщение об ошибке:

module.js:338                                                                 
    throw err;                                                                
          ^                                                                   
Error: Cannot find module 'C:\dev\git\FAKESimpleDemo\node_modules\npm\bin\npm-
cli.js'                                                                       
    at Function.Module._resolveFilename (module.js:336:15)                    
    at Function.Module._load (module.js:278:25)                               
    at Function.Module.runMain (module.js:501:10)                             
    at startup (node.js:129:16)                                               
    at node.js:814:3                                                          
Running build failed.                                                         
Error:                                                                        
System.Exception: Operation failed or timed out                               
   at FSI_0001.clo@62-10.Invoke(Unit _arg2) in C:\Dev\git\FAKESimpleDemo\build
.fsx:line 69                                                                  
   at Fake.TargetHelper.runSingleTarget(TargetTemplate`1 target) in C:\code\fake\src\app\FakeLib\TargetHelper.fs:line 483                                   

По умолчанию npm.cmd выглядеть так:

:: Created by npm, please don't edit manually.
@IF EXIST "%~dp0\node.exe" (
  "%~dp0\node.exe" "%~dp0\.\node_modules\npm\bin\npm-cli.js" %*
) ELSE (
  node "%~dp0\.\node_modules\npm\bin\npm-cli.js" %*
)

Так что кажется, что %~dp0 получить разрешение на то, что является рабочим каталогом ExecProcess а не путь к папке npm.cmd который предназначен.

Есть идеи, как решить эту проблему или как запустить npm из FAKE?

Обновить

У меня есть пример проекта, который иллюстрирует это здесь: https://github.com/mastoj/FAKESimpleDemo/commit/1066c6d78cd0c8d8ab261f647118b30d15487c2f

Требуется, чтобы узел был установлен.

Обновление 2:

Я думаю, что я сейчас, что происходит, но не как это решить. Если вы бежите npm из обычной командной строки все работает как надо, но если запустить "npm" (обратите внимание на кавычки) вы получаете ту же ошибку. По какой-то причине %~dp0 решаться по-разному в зависимости от того, как что-то вызывается, что кажется странным.

0 ответов

Я использую FAKE и PAKET, чтобы собрать приложение Angular 6 и упаковать его в пакет NuGet. Цели, которые создает мое приложение, следующие:

Target.create "BuildAngular"( fun _ -> 
    Trace.setBuildNumber (CreateInformationalVersion versionInfo)
    Npm.run "buildproductive" (fun o -> { o with WorkingDirectory = "./src"})
    Directory.Move("./src/dist/", dirAngularOutput)
    ZipFile.CreateFromDirectory (dirAngularOutput, dirBuildOutput @@ "gui.zip")
)

Параметр "buildproductive" является целью, которую я определил в package.json в массиве scripts:

"scripts": {
    "ng": "ng",
    "start": "ng serve",
    "build": "ng build",
    "buildproductive": "node_modules/.bin/ng build --prod",
    "test": "ng test",
    "test:ci": "node_modules/.bin/ng test --karma-config=src/karma.ci.conf.js",
    "test:headless": "node_modules/.bin/ng test --karma-config=src/karma.headless.conf.js",
    "lint": "ng lint",
    "e2e": "ng e2e"
}
Другие вопросы по тегам