使用nant通过exec编译LESS

我有一个在Windows Server 2012上运行CruiseControl.NET的持续集成服务器。该服务以用户ccnet运行。 我通过RDPlogin到服务器,打开命令窗口,并validationPATH包含C:\Tools\NodeJS

我在全球范围内的安装较less,因为我有一大堆我开始使用LESS的项目,对于CI服务器,只需要一个实例,而不必将其安装到每个项目中(这些项目不需要它在本地运行;我们在开发中使用LessJS,当标志在debugging模式下运行时将其移除)。

 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执行这个,我得到臭名昭着的“找不到模块”:

 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) 

很明显,它在错误的地方寻找less。 但为什么? 我的PATH是正确的,如上所述。 它从命令行工作。 workingdir属性设置为与命令行示例中相同的文件夹。

有没有更好的方法来设置一个CI场景?

我能够通过欺骗来解决问题。

意识到它从命令提示符运行正常,我只是告诉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>