23

我正在尝试gruntfile.js在 TeamCity 中运行一个简单的构建。但是,即使将 grunt 和 grunt-cli 作为全局节点包安装后,TeamCity 仍然无法识别它们。我可以输入grunt命令行并且它可以工作,但是当我通过命令行运行程序或带有参数的可执行文件在 TeamCity 中运行它时,它仍然给出

'grunt' is not recognized as an internal or external command

我还尝试安装TeamCity.Node,这是一个用于运行 grunt 脚本的插件,但它也找不到 grunt。有任何想法吗?

4

8 回答 8

33

我无法让公认的解决方案发挥作用。对我来说,问题是 TeamCity 服务(服务器和代理)在系统帐户下运行。AFAIK,没有“为操作系统的所有用户全局安装 npm 包”的概念。所以我:

  1. 创建了一个 TeamCity windows 用户
  2. 将 TeamCity 服务更改为以该用户身份运行
  3. 以 TeamCity 用户身份登录操作系统
  4. 运行 npm install -g grunt-cli
  5. 重新启动了服务。

从那里开始,NodeJS、NPM 和 Grunt 任务才刚刚开始工作。

于 2013-05-22T22:33:20.180 回答
14

这是对克里斯托弗的回答的补充(我没有足够的声誉发表评论)。

如果您不想在构建服务器上创建用户,可以编写完整路径来执行 npm 包。这是一个命令行运行程序,无需在构建服务器上创建专用用户即可运行Weyland :

  • 可执行命令:"C:\Program Files\nodejs\node.exe"
  • 命令参数:c:\users\Administrator\AppData\Roaming\npm\node_modules\weyland\bin\cli.js build

顺便说一句,Node.js 的安装程序似乎有另一种解决方案。不幸的是,它被修剪了!

这是 Node.js 安装程序的屏幕截图:

于 2013-09-18T20:00:07.207 回答
5

当我试图让 grunt 与 TFS 一起工作时,我遇到了同样的问题,它将由tfsservice用户运行。正如克里斯托弗的回答所暗示的那样,以不同的用户身份运行我们的构建不是我们的选择。在我将C:\Users\tfsservice\AppData\Roaming\npm添加到tfsservice用户的路径后,当我以 tfsservice 身份手动登录时,它能够找到 grunt-cli,但在 TFS Build 代理执行构建时却找不到。起初,我只是将构建过程更改为使用 grunt.cmd 文件的完整路径。

所以我改变了使用这个:

grunt deploy

使用这个:

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

我想为您的 Team City 用户做同样的事情也会解决这个问题。当然,如果你这样做,你必须确保 grunt-cli 安装在所有构建服务器上的相同位置。

事实证明,我刚刚错过了重新启动 PC 的最后一步(以便重新启动 tfsservice),然后构建能够在不指定完整路径的情况下找到 grunt。

我假设 Zeke Lu 的回答显示的修剪过的 node.js 安装程序描述会说其他用户需要更新他们的 Path 环境变量。

于 2013-11-14T20:10:45.803 回答
4

确保 %AppData%\Roaming\npm 路径在你的 windows GLOBAL 路径变量上,重新启动团队代理服务并且将工作

于 2014-02-12T12:49:47.897 回答
2

您应该在安装 NPM 后重新启动 TeamCity 构建代理。

于 2018-01-19T14:46:48.923 回答
1

我知道这个问题有点老了。但是我现在在同样的问题上苦苦挣扎,找不到解决方案……但最终我做到了。这个给你。

TeamCity 构建步骤应包括:

1) 安装 grunt-cli 命令行命令:npm install grunt-cli

2) 运行 grunt build task 命令行命令:node "node_modules/grunt-cli/bin/grunt" build

这两种情况的工作目录都应该是您的 grountfile.js 所在的位置。

于 2016-01-25T19:19:48.120 回答
0

这是一个奇怪且非常烦人的错误,但我终于找到了解决方法。在该%AppData%\Roaming\npm目录中,有两个文件:“grunt”和“grunt.cmd”。“grunt”是一个 unix 文件,“grunt.cmd”应该使用节点运行 grunt-cli 应用程序,但它没有。我必须创建一个名为“grunt.bat”(优先于“grunt.cmd”)的新文件,其中包含

node "%~dp0\node_modules\grunt-cli\bin\grunt" %*

现在它起作用了。不知道为什么。

于 2013-05-07T22:59:44.007 回答
0

您无需像 Christoper 所写的那样将 TeamCity 帐户从系统更改为本地帐户。这是更简单的方法:

1.[构建代理机器]确保你的PATH中有节点目录和本地npm包目录,例如:

C:\Users\'yourUserName'\AppData\Roaming\npm;C:\Program Files\nodejs
  1. [构建代理机器] 全局安装 grunt:npm install grunt-cli
  2. [构建步骤] 在你的项目目录中运行 cmd: npm install -g grunt-cli. 您只能执行一次此步骤(在本地计算机上)并将文件更改提交到 repo
  3. [构建步骤] 在您的项目目录中运行 cmd:npm install
  4. [构建步骤] 运行 grunt build 作为 powershell 脚本:powershell -Command "grunt build"

由于某种原因,在系统帐户上运行的构建代理无法C:\Users\'yourUserName'\AppData\Roaming\npm通过 cmd 访问,但可以通过 powershell 访问。

于 2015-05-16T13:34:25.617 回答