我正在尝试使用FAKE替换rake脚本,但是遇到了一些问题,导致另一个应用程序出现问题。在rake中我会做sh 'bundle exec jekyll "#{outputDir}"'
之类的事情bundle
PATH
,但是在.NET / FAKE中我无法在没有弹出新窗口的情况下运行命令。
我的具体用例是针对FAKE及其ProcessHelper,但我认为这个问题可以推广到ProcessStartInfo的任何使用。
以下命令成功运行(info
是ProcessStartInfo
),但会弹出一个新窗口:
ExecProcess (fun info ->
info.UseShellExecute <- true
info.CreateNoWindow <- true //doesn't apply when UseShellExecute is true
info.FileName <- "bundle"
info.WorkingDirectory <- workingDir
info.Arguments <- "exec jekyll \"" + outputDir + "")
(TimeSpan.FromMinutes 5.)
要重用当前窗口,我将UseShellExecute
设置为false
,但是找不到“bundle”命令(“例外:进程包启动失败。系统找不到指定的文件“)。我猜测没有UseShellExecute
PATH
环境未设置,因此我尝试调用setEnvironmentVariables
:
let pathEnv = Environment.GetEnvironmentVariable("PATH")
ExecProcess (fun info ->
info.UseShellExecute <- false
info.FileName <- "bundle"
info.WorkingDirectory <- workingDir
info.Arguments <- "exec jekyll \"" + outputDir + "")
setEnvironmentVariables info [("PATH", pathEnv)])
(TimeSpan.FromMinutes 5.)
有没有办法配置ProcessStartInfo
来做我想要的事情?或者我应该使用ProcessStartInfo
的替代方案吗?
答案 0 :(得分:2)
我找不到办法,所以最终手动搜索路径。
let findExecutableInPath (exe:String) =
Environment.GetEnvironmentVariable("PATH").Split([| Path.PathSeparator |])
|> Seq.append ["."]
|> Seq.map (fun p -> p @@ exe)
|> Seq.tryFind (File.Exists)
我会看看这是否适合用于FAKE。
(如果有人有更好的想法,转换为社区维基)))