TFS Build 找不到 Grunt

Posted

技术标签:

【中文标题】TFS Build 找不到 Grunt【英文标题】:TFS Build cannot find Grunt 【发布时间】:2013-11-27 22:11:24 【问题描述】:

我已经在我们的 TFS 构建服务器上安装了 npm 和 grunt。我使用 npm install -g grunt-cli 安装了 grunt-cli,然后以我自己的身份登录时能够从命令行运行 grunt deploy

Out TFS 构建以 tfsservice 用户身份运行,当它尝试执行 grunt deploy 时,它会收到一条错误消息:

'grunt' is not recognized as an internal or external command, operable program or batch file.

所以,当我在构建服务器上以我自己的身份登录时,如果我以 tfsservice 身份运行命令提示符,我会得到同样的错误。所以我尝试从该命令提示符执行 npm install -g grunt-cli ,它看起来已经正确安装并在 C:\Users\tfsservice\AppData\Roaming\npm 中创建了 grunt 文件,但是然后我在运行 grunt deploy 时仍然遇到同样的错误。

所以看起来 grunt-cli 没有为 tfsservice 安装?当我得到 tfsservice %homepath% 时,我看到它设置为 \Windows\system32,而不是预期的 \Users\tfsservice;也许它是一个服务帐户与它有关?

我看到 a similar questions has been asked for using grunt-cli with Team City,但它建议使用 Team City 特定插件。

还有this post 表示他们更改了 Team City 以不同的用户身份运行,然后一切才开始正常运行。不过,将我们的构建更改为以不同于 tfsservice 的用户身份运行对我来说并不是一个真正的选择。

感谢任何建议。谢谢。

【问题讨论】:

顺便说一句,我所做的是创建一个运行 BuildAgent 的新用户,而不仅仅是以 tfsservice 身份登录然后安装 grunt。 是的,我在链接的帖子中看到了这一点,但我们不想创建另一个用户;我们希望我们的所有构建都作为 tfsservice 运行,因为它已经拥有构建需要执行的各种其他任务以及需要与之交互的服务器的所有权限。 【参考方案1】:

我们遇到了同样的问题,我们做了以下事情:

首先,我们在系统用户上安装了所有用于构建的软件。

为了找出将使用哪个用户,我们添加了一个带有 echo %username% 的批处理文件,并将“批处理脚本”任务添加到构建过程中,并让该任务执行我们的脚本。

因此,如果 TFS 正在构建工件,我们可以使用 TFS 使用的同一用户在 TFS 上安装所有需要的软件。

我们尝试了 npm 是否正常工作,grunt 是否已全局安装,并且 ruby​​ 也获得了它的 sass gem。在一些配置和添加丢失的路径变量后一切正常。

所以我们知道构建用户理解所有给定的批处理命令,因为我们也在这个用户登录的情况下进行了尝试。对吗?

错误 =( ...每次构建总是向我们展示:

'grunt' is not recognized as an internal or external command, operable program or batch file.

还有 npm 和 ruby​​ sass。

所以我们以与描述相同的方式执行了一个批处理脚本,只是 echo %path% 作为其内容。

在多次构建失败并通过批处理脚本和绝对路径调用所有工具之后,我们找到了这篇文章并简单地重新启动了 TFS,一切都像魅力一样运行。

因此,TFS 似乎正在缓存给定的路径变量,并且没有在每次构建时都查找它们。其他一些解释或提示如何避免 TFS 的这种行为?

我发现了一个way 用于 windows cli 的相同行为,并且可以想象它仍然是同样的问题,因此我们可以在每次构建之前运行这个脚本。 但在我看来,这看起来有点老套。

谢谢大家的好帖子。

【讨论】:

是的,我们在这里也有同样的情况。您也可以在路径中引入 grunt,并在您的任务或批处理脚本中继续使用“grunt”。但是您必须重新启动 TFS,因为它会像 windows cli 一样在启动时从操作系统加载路径变量。【参考方案2】:

我也经历过这种失败。将 npm 文件夹添加到全局路径并重新启动服务器确实解决了这个问题。

【讨论】:

你能扩展你的答案吗? 假设 TFS 构建过程以名为 tfsservice 的用户身份运行,npm 包的默认位置将是 C:\Users\tfsservice\AppData\Roaming\npm。只需将此位置附加到系统 PATH 变量并重新启动。【参考方案3】:

tfsservice 身份登录并运行 npm install -g grunt-cli 后,它会将所有 grunt 文件放在 C:\Users\tfsservice\AppData \Roaming\npm,但在我添加 C:\Users 之前它找不到 C:\Users\tfsservice\AppData\Roaming\npm\grunt.cmd 文件\tfsservice\AppData\Roaming\npm 到系统路径;您也许可以为 tfsservice 用户的变量创建一个新的 Path 变量,但我希望它在以其他用户身份登录时也能工作。

当我以 tfsservice 手动登录并打开新的命令提示符时,grunt deploy 工作后,但当实际的 TFS 构建以 tfsservice 执行构建时仍然无法工作。起初我只是修改了我的构建过程,使用其完整路径从命令行调用 grunt.cmd,如下所示:

"C:\Users\tfsservice\AppData\Roaming\npm\grunt.cmd" deploy

并确保我在所有构建机器上将 npm install -g grunt-cli 作为 tfsservice 运行,以确保 grunt 存在于每个构建服务器上的 tfsservice 用户的 AppData 目录中。这行得通,但与其说是修复,不如说是一种解决方法。

原来最后一步是我只需要重新启动 TFS 构建服务器。一旦我这样做了 grunt deploy 就可以按预期进行构建,所以我不需要再指定完整路径了:) 只需重新启动 tfsservice 可能就足够了,但我只是重新启动了 PC安全。

【讨论】:

以上是关于TFS Build 找不到 Grunt的主要内容,如果未能解决你的问题,请参考以下文章

使用 grunt 时找不到模块“业力”

使用需要 grunt 找不到模块“咖啡脚本”

Grunt 错误:找不到模块“time-grunt”

grunt:从终端运行时找不到命令

使用grunt时找不到模块'karma'

Grunt.js 和 imagemin - 找不到“imagemin”目标