如何从VisualStudio的后期构建事件启动后台任务?

7
我将尝试在从VisualStudio运行特定项目时启动grunt watch实例。我编写了一个使用ember编写的单页应用程序,并使用grunt进行编译,该应用程序连接到使用WebAPI编写的后端。我正在尝试减少摩擦,使得可以通过在VS中启动调试(F5)并让它启动所有内容。

如果我添加一个post-build事件以使用grunt编译应用程序,那么它可以正常工作:
node node_modules\grunt-cli\bin\grunt dev --no-color

grunt watch 永远不会停止,因此 VisualStudio 构建似乎会挂起,直到您终止 node.exe 进程(这在大多数情况下是可以预期的,除了无法使用 Ctrl+Break 在 VS 中停止):

node ../node_modules\grunt-cli\bin\grunt watch --no-color

我已经尝试使用“start”命令启动,但是VisualStudio仍然等待它退出(只是显示“Build started…”):
start node ../node_modules\grunt-cli\bin\grunt dev --no-color

我也尝试了使用start命令的/i参数,但这并没有起到帮助作用。它会打开一个新窗口来运行grunt watch,但构建不会继续(应用程序也不会启动)直到我关闭控制台窗口。
很可能这与进程是构建过程的子进程有关?有没有一种真正的方法可以启动后台任务而不让VisualStudio等待它呢?
1个回答

6

不确定为什么使用“start”命令无法解决问题(在命令行中可以完美运行),但据我所知,msbuild会为其构建事件生成一个单独的cmd进程,因此与此有关。

一个可行的替代方案是使用PowerShell来启动进程。对于内置的PowerShell语法没有什么头绪,但调用C#的Process.Start同样有效:

powershell -Command "[System.Diagnostics.Process]::Start( '/path/to/node', 'args' )"

这回答了你的问题,但我认为这不是你真正想要问的,你问错了问题... 你说你想要“每当从VisualStudio运行特定项目时启动一个实例”,但然后你继续询问发生在项目构建时的构建事件。那是不同的,并且似乎不方便,因为每次构建都会启动一个新实例。相反,我认为你实际上想要/需要的是每次开始调试项目时启动一个实例。可以按照这里的步骤来实现:
  • 向解决方案添加一个空项目
  • 在项目的属性->调试下输入你的节点命令
  • 右键单击解决方案,选择设置启动项目
  • 选择多个启动项目
  • 将你的主项目的Action设置为启动
  • 将空项目的Action设置为无调试启动
现在按F5,VS将启动节点,并开始调试你的项目。

你能详细说明一下“在项目的属性->调试下输入你的节点命令”的意思吗? - Jared Beach
1
@JaredBeach,像问题中那样启动Node的命令,类似于node ../node_modules\grunt-cli\bin\grunt watch --no-color - stijn
有没有办法在停止调试时关闭它?在“启动外部程序”下,我有“C:\ Windows \ System32 \ java.exe”,在命令行参数下,我有“-jar fakeSMTP-2.0.jar -s”。但是当我停止调试时它并不会关闭。 - Jared Beach
没事了。我从控制台应用程序项目切换到了WinForm,问题解决了...不知道为什么。 - Jared Beach

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接