Command line TeamCity生成运行程序无法识别可执行文件

Command line TeamCity生成运行程序无法识别可执行文件,command-line,gruntjs,Command Line,Gruntjs,我正在尝试运行一个简单的gruntfile.js,作为TeamCity构建的一部分。但是,即使将grunt和grunt cli作为全局节点包安装,TeamCity仍然无法识别它们。我可以在命令行中键入grunt,它可以工作,但当我在TeamCity中通过命令行运行程序或带有参数的可执行文件运行它时,它仍然会给出 “grunt”不被识别为内部或外部命令 我还尝试了安装,这是一个运行grunt脚本的插件,但它也找不到grunt。有什么想法吗?这是一个奇怪且非常烦人的bug,但我终于找到了解决办法。在

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

“grunt”不被识别为内部或外部命令


我还尝试了安装,这是一个运行grunt脚本的插件,但它也找不到grunt。有什么想法吗?

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

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

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

我无法得到公认的解决方案。我的问题是TeamCity服务(服务器和代理)是在系统帐户下运行的。顺便说一句,没有“为操作系统的所有用户全局安装npm包”的概念。因此,我:

  • 创建了TeamCity windows用户
  • 将TeamCity服务更改为作为该用户运行
  • 以TeamCity用户身份登录操作系统
  • 运行npm安装-g grunt cli
  • 重新启动服务

  • 从那以后,NodeJS、NPM和Grunt任务才开始工作。

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

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

    • 命令可执行文件:
      “C:\Program Files\nodejs\node.exe”
    • 命令参数:
      c:\users\Administrator\AppData\Roaming\npm\node\u modules\weyland\bin\cli.js build
    顺便说一句,Node.js的安装程序似乎有另一个解决方案。不幸的是,它被修剪了

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

    我遇到了tfsservice用户将运行它的地方。按照克里斯托弗的回答,以不同的用户身份运行构建对我们来说不是一个选择。在我将C:\Users\tfsservice\AppData\Roaming\npm添加到tfsservice用户路径后,当我以tfsservice身份手动登录时,它能够找到grunt cli,但在TFS生成代理执行生成时却找不到。起初,我只是更改了构建过程以使用grunt.cmd文件的完整路径

    所以我不再使用这个:

    grunt deploy
    
    "C:\Users\tfsservice\AppData\Roaming\npm\grunt.cmd" deploy
    
    要使用此选项,请执行以下操作:

    grunt deploy
    
    "C:\Users\tfsservice\AppData\Roaming\npm\grunt.cmd" deploy
    
    我想对您的TeamCity用户做同样的操作也会解决问题。当然,如果您这样做,您必须确保grunt cli安装在所有构建服务器上的相同位置

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


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

    确保%AppData%\Roaming\npm Path位于windows全局路径变量上,重新启动TeamAgent服务并将正常工作

    您无需将TeamCity帐户从系统更改为本地帐户。更简单的方法是:

    1.[构建代理计算机]确保路径中有节点目录和本地npm程序包目录,例如:

    C:\Users\'yourUserName'\AppData\Roaming\npm;C:\Program Files\nodejs C:\Users\yourUserName'\AppData\Roaming\npm;C:\Program Files\nodejs
  • [构建代理计算机]全局安装grunt:
    npm安装grunt cli
  • [构建步骤]在项目目录中运行cmd:
    npm安装-g grunt cli
    。您只能执行此步骤一次(在本地计算机上),并将文件更改提交到repo
  • [构建步骤]在项目目录中运行cmd:
    npm安装
  • [构建步骤]以powershell脚本的形式运行grunt构建:
    powershell-命令“grunt构建”

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

    我知道这个问题有点老了。但我现在也在努力解决同样的问题,却找不到解决办法。。。但最后我做到了。给你

    TeamCity构建步骤应包括:

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

    2) 运行grunt构建任务 命令行 命令:node“node\u模块/grunt cli/bin/grunt”构建


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

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

    实际上,这可能是一个比我的更好的解决方案。好发现!另请看:我可以验证重新启动使这个问题从我身上消失了,现在一切都按照预期工作,没有任何问题。只是把这个扔出去,对我来说,Nodejs安装程序为每个用户安装了npm,但我只是需要重新启动才能让环境变量对其他用户有效。我不知道为什么会被否决,事实上我就是这么做的。影响最小的东西。。Thanks我不相信%AppData%在全局环境变量中工作(在服务器2019 1809上测试)-它需要在用户环境路径变量中。我从用户路径变量中获取路径“C:\Users\\AppData\Roaming\npm”,并将其添加到系统路径变量中。然后,我必须使用windows应用程序重新启动TeamCity构建代理服务。