我有一台在Windows Server 2012上运行CruiseControl.NET的持续集成服务器。该服务以用户ccnet
运行。我已通过RDP登录服务器,打开命令窗口,并验证PATH
包含C:\Tools\NodeJS
。
我在全球范围内安装较少,因为我有一堆项目,我开始使用LESS,而对于CI服务器,只有一个实例才有意义,而不是必须将其安装到每个项目(项目不需要它在本地运行;我们在开发中使用LessJS,并在未在调试模式下运行时删除它)。
C:\Tools\NodeJS>npm install less -g
C:\Users\ccnet\AppData\Roaming\npm\lessc -> C:\Users\ccnet\AppData\Roaming\npm\node_modules\less\bin\lessc
less@1.7.3 C:\Users\ccnet\AppData\Roaming\npm\node_modules\less
├── graceful-fs@2.0.3
... etc...
我可以手动调用lessc
:
C:\CruiseControl\MyProject\private\working>lessc.cmd Website\Content\MyProject.less MyProject.css
C:\CruiseControl\MyProject\private\working>dir MyProject.css
...
06/24/2014 11:52 AM 159,145 MyProject.css
但是当我试图通过exec
在nant中运行时,我得到臭名昭着的“模块未找到”:
module.js:340
throw err;
^
Error: Cannot find module 'c:\CruiseControl\MyProject\private\working\node_modules\less\bin\lessc'
at Function.Module._resolveFilename (module.js:338:15)
at Function.Module._load (module.js:280:25)
at Module.runMain (module.js:492:10)
at process.startup.processNextTick.process._tickCallback (node.js:244:9)
显然,它正在寻找错误的地方。但为什么?如上所述,我的PATH
是正确的。它从命令行工作。 workingdir
属性设置为与命令行示例中相同的文件夹。
有没有更好的方法为CI场景设置它?
答案 0 :(得分:1)
我能够通过欺骗来解决这个问题。
意识到它从命令提示符运行正常,我只是告诉nant使用/ c参数调用命令提示符,然后是lessc以及我想传递给它的所有参数:
<exec program="cmd.exe" workingdir="${buildfolder}" failonerror="true">
<arg line="/c lessc.cmd --clean-css Website\Content\Site.less Website\Content\Site.min.css" />
</exec>