Node.js TFS生成找不到Grunt
我已经在我们的TFS构建服务器上安装了npm和grunt。我使用npm install-g grunt cli安装了grunt cli,然后在以我自己的身份登录时能够从命令行运行grunt deploy Out TFS构建以tfsservice用户的身份运行,当它尝试执行grunt部署时,会收到一条错误消息:Node.js TFS生成找不到Grunt,node.js,tfs,npm,grunt-cli,Node.js,Tfs,Npm,Grunt Cli,我已经在我们的TFS构建服务器上安装了npm和grunt。我使用npm install-g grunt cli安装了grunt cli,然后在以我自己的身份登录时能够从命令行运行grunt deploy Out TFS构建以tfsservice用户的身份运行,当它尝试执行grunt部署时,会收到一条错误消息: 'grunt' is not recognized as an internal or external command, operable program or batch file.
'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;也许它是一个服务帐户与此有关
我看到了,但它建议使用特定于TeamCity的插件
还有一种说法是,他们改变了TeamCity作为不同的用户运行,然后一切都开始正常工作。不过,将构建更改为以不同于tfsservice的用户身份运行对我来说并不是一个真正的选择
如有任何建议,我们将不胜感激。谢谢。作为tfsservice登录并运行npm安装-g grunt cli后,它将所有grunt文件放在C:\Users\tfsservice\AppData\Roaming\npm中,但在我将C:\Users\tfsservice\AppData\Roaming\npm\grunt.cmd添加到系统路径之前,它找不到C:\Users\tfsservice\AppData\Roaming\npm文件;您可以仅为tfsservice用户的变量创建一个新的Path变量,但我希望它在作为其他用户登录时也能正常工作
有一次,当我以tfsservice的身份手动登录并打开一个新的命令提示符时,grunt部署可以工作,但当实际的TFS构建以tfsservice的身份执行构建时,grunt部署仍然无法工作。首先,我只是修改了构建过程,使用其完整路径从命令行调用grunt.cmd,如下所示:
"C:\Users\tfsservice\AppData\Roaming\npm\grunt.cmd" deploy
并确保在所有生成计算机上以tfsservice的身份运行npm install-g grunt cli,以确保每个生成服务器上的tfsservice用户的AppData目录中都存在grunt。这是可行的,但与其说是修复,不如说是一种变通办法
最后一步是重新启动TFS构建服务器。一旦我完成了grunt部署,它就可以像预期的那样为构建工作,因此我不再需要指定完整路径:)简单地重新启动TFS服务可能已经足够了,但为了安全起见,我只是重新启动了电脑。我也经历了这个失败。将npm文件夹添加到全局路径并重新启动服务器确实解决了此问题。我们遇到了相同的问题,并采取了以下措施: 首先,我们在系统用户上安装了同样用于构建的所有软件 为了找出将使用哪个用户,我们添加了一个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似乎正在缓存给定的路径变量,而不是在每个构建中都查找它们
我在windows cli中找到了一个相同行为的解决方案,可以想象它仍然是相同的问题,因此我们可以在每次构建之前运行此脚本。
但我的看法似乎有点不妥
Thx伙计们,谢谢你的好帖。顺便说一句,我所做的是创建一个运行BuildAgent的新用户,而不仅仅是以tfsservice的身份登录,然后安装grunt。是的,我在链接的帖子中读到了这一点,但我们不想创建另一个用户;我们希望我们所有的构建都以tfsservice的身份运行,因为它已经拥有了该应用程序的所有权限生成需要执行的各种其他任务及其需要与之交互的服务器。您能对您的答案进行一点扩展吗?假设TFS生成过程作为名为tfsservice的用户运行,npm包的默认位置将是
C:\Users\tfsservice\AppData\Roaming\npm
。只需将此位置附加到系统中即可PATH变量和reboot.yup,我们这里有相同的。您也可以在路径中引入grunt,然后在任务或批处理脚本中继续使用“grunt”。但是您必须重新启动TFS,因为它与windows cli一样在启动时从操作系统加载路径变量。