使用nant通过exec编译LESS

时间:2014-06-24 15:58:15

标签: node.js less npm cruisecontrol.net nant

我有一台在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场景设置它?

1 个答案:

答案 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>