Visual studio dotless.compi.exe。为什么会停止?我做错了什么?或者建议我和其他方法

Visual studio dotless.compi.exe。为什么会停止?我做错了什么?或者建议我和其他方法,visual-studio,less,nuget,Visual Studio,Less,Nuget,我正在尝试将我的less文件编译成css,我正在使用dotless 我用nuget安装了它。这是我在项目“预构建事件命令行”中设置的设置 在构建过程中,它只是打开记事本中的style.less文件,然后停在那里。当我关闭less文件时,它会打开输出css(空),同样的故事也会在这里停止,当我关闭css时,它会进行常规构建 想法?需要时间吗?这种行为正常吗 编辑 在Windows环境中,是否有其他方法可以编译更少的代码?正如我在一些问题评论中所说的,因为DotLess不适合我,我转而使用其他方法:

我正在尝试将我的
less
文件编译成
css
,我正在使用
dotless

我用
nuget
安装了它。这是我在项目“预构建事件命令行”中设置的设置

在构建过程中,它只是打开记事本中的
style.less
文件,然后停在那里。当我关闭
less
文件时,它会打开输出
css
(空),同样的故事也会在这里停止,当我关闭
css
时,它会进行常规构建

想法?需要时间吗?这种行为正常吗

编辑


在Windows环境中,是否有其他方法可以编译更少的代码?

正如我在一些问题评论中所说的,因为DotLess不适合我,我转而使用其他方法:使用官方的更少代码编译器(JavaScript one)编译更少的代码,并使用Windows脚本主机执行

在解决方案目录中创建一个文件夹(即存储特定解决方案的.sln和项目目录的位置)。将您的文件夹命名为Build

您需要这些脚本(为Build文件夹中的每个脚本创建一个文件,我将为您提供整个文件名):

lessc.wsf

<!--
Less.js compiler for Windows Script Host
http://blog.dotsmart.net/

Copyright (c) 2010, Duncan Smart
Licensed under the Apache 2.0 License.
-->
<job>
<script language="jscript">
     // Stub out globals
    var window = this;
    var location = window.location = { 
        port: 0,
        href: ''
    };
    var fso = new ActiveXObject("Scripting.FileSystemObject");
    var input = null;

    var util = {
        readText: function (filename) {
            //WScript.StdErr.WriteLine("readText: " + filename);
            var file = fso.OpenTextFile(filename);
            // Don't error on empty files
            var text = file.AtEndOfStream ? '' : file.ReadAll();

            // Strip off any UTF-8 BOM
            var utf8bom = String.fromCharCode(0xEF, 0xBB, 0xBF);
            if (text.substr(0, utf8bom.length) == utf8bom) {
                text = text.substr(utf8bom.length);
            }
            file.Close();
            return text;
        }
    };

    // XMLHttpRequest that just gets local files. Used when processing "@import"
    function XMLHttpRequest(){}
    XMLHttpRequest.prototype = {
        open: function (method, url, async) {
            this.url = url;
        },
        send: function () {
            // get the file path relative to the input less file/directory
            var currDir = fso.folderExists(input) ? input : fso.getParentFolderName(input);
            var filename = fso.BuildPath(currDir, this.url);

            //WScript.StdErr.WriteLine("XHR.send " + filename);

            // Little hack so *.less will resolve to *.less.css also. Helps with Visual Studio 
            // ensuring that file BuildAction is set to Content and you get rudimentary syntax highlighting with no set up.
            if (filename.match(/.less$/i) && !fso.FileExists(filename)) {
                filename = filename.replace(/.less$/i, '.less.css');
            }

            try {
                this.status = 200;
                this.responseText = util.readText(filename);
            }
            catch (e) {
                this.status = 404;
                this.responseText = e.description;
            }
        },
        setRequestHeader:  function () {},
        getResponseHeader: function () {}
    };

    // Fake document
    var document = {
        _dummyElement: {
            childNodes: [], 
            appendChild: function(){},
            style: {}
        },
        getElementsByTagName: function(){ return []; },
        getElementById: function(){ return this._dummyElement; },
        createElement:  function(){ return this._dummyElement; },
        createTextNode: function(){ return this._dummyElement; }
    };        

</script>

<!-- less.js from https://github.com/cloudhead/less.js/tree/master/dist/ -->
<script language="jscript" src="less.js" />

<script language="jscript"> 
    // Parse args
    var args = {};
    for (var i = 0; i < WScript.Arguments.Length; i++) {
        var arg = WScript.Arguments.Item(i);
        // Handle "-switch" and "--switch"
        var match = arg.match(/^--?([a-z][0-9a-z-]*)$/i);
        if (match) {
            i = match[1];
            arg = true;
        }
        args[i] = arg;
    }

    input = args[0];
    var output = args[1];

    if (fso.folderExists(input)) {
        input = fso.getAbsolutePathName(input);
        var files = getFiles(input, /\.less$/i);
        for (var i = 0; i < files.length; i++) {
            var file = files[i];
            convert(file.path, output + '\\' + file.name.replace( /\.less$/i, '.css'));
        }
    }
    else {
        if (fso.folderexists(output)) {
            output = fso.getAbsolutePathName(output) + '\\' + fso.getfile(input).name.replace(/\.less$/i, '.css');
        }
        convert(input, output);
    }

    // Returns array of {name:'foo.bar', path:'c:\baz\foo.bar'} for given directory and pattern
    function getFiles(dir, regex) {
        var e = new Enumerator(fso.getFolder(dir).files);
        var files = []
        for (; !e.atEnd(); e.moveNext()) {
            if (regex.test(e.item().path)) {
                files.push({
                    name: e.item().name, 
                    path: e.item().path
                });
            }
        }
        return files;
    }

    function convert(input, output) {
        if (!input) {
            WScript.StdErr.WriteLine("lessc.wsf: no input files");
            WScript.StdErr.WriteLine("Usage:");
            WScript.StdErr.WriteLine("  Single file: cscript //nologo lessc.wsf input.less [output.css] [-compress]");
            WScript.StdErr.WriteLine("  Directory:   cscript //nologo lessc.wsf inputdir outputdir [-compress]");
            WScript.Quit(1);
        }

        var data;
        if (input == '-') {
            var chunks = [];
            while (!WScript.StdIn.AtEndOfStream)
            chunks.push(WScript.StdIn.ReadAll());
            data = chunks.join('');
        }
        else {
            data = util.readText(input);
        }

        var parser = new less.Parser({
            filename: input
        });

        try {
            parser.parse(data, function (err, tree) {

                if (err) {
                    WScript.StdErr.WriteLine("ERR: ");
                    for (var i in err) {
                        if (err[i]) {
                            WScript.StdErr.WriteLine("  " + i + ': ' + err[i]);
                        }
                    }
                    WScript.Quit(2);
                }
                else {
                    var css = tree.toCSS({
                        compress: args.compress
                    });
                    if (output) {
                        if(fso.FileExists(output))
                    {
                       var checkfile = fso.GetFile(output);
                       if(checkfile.Attributes & 1)
                       {
                           checkfile.Attributes = checkfile.Attributes ^ 1
                       }
                    }
                        var outputfile = fso.CreateTextFile(output);
                        outputfile.Write(css);
                        outputfile.Close();
                    }
                    else {
                        WScript.StdOut.Write(css);
                    }
                }
            });
        }
        catch (e) {
            WScript.StdErr.WriteLine("ERROR:");
            for (var i in e) {
                if (e[i]) {
                    WScript.StdErr.WriteLine("  " + i + ': ' + e[i]);
                }
            }
            WScript.Quit(3);
        }

        // Sometimes less will return errors inside the fake HTML element
        if (document._dummyElement.innerHTML && document._dummyElement.innerHTML.match(/Syntax Error/i)) {
            var s = document._dummyElement.innerHTML;
            s = s.replace(/<[^>]+(\/?)>/g, function (m) { return m.indexOf('/') > 0 && m !== '</label>' ? "\n" : '' });
            s = s.replace(/\n+/g, '\n');

            WScript.StdErr.WriteLine("ERR: ");
            WScript.StdErr.WriteLine(s);
            WScript.Quit(2);
        }
    }
</script>
</job>
更少的目标

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
  <DotLessCompilerPath>$(SolutionDir)Build\lessc.cmd</DotLessCompilerPath>
</PropertyGroup>
  <Target Name="AllLessToCss" AfterTargets="AfterBuild">
    <CreateItem Include="$(ProjectDir)**\*.less">
      <Output TaskParameter="Include" ItemName="LessFile" />
    </CreateItem>

    <Message Text="" Importance="high" />
    <Message Text="Now compiling LESS files..." Importance="high" />
    <Message Text="------------------------------------------------------------" Importance="high" />
    <Message Text="" Importance="high" />
    <Message Text="File: &quot;%(LessFile.FullPath) ======>>>>> &quot;%(LessFile.RootDir)%(LessFile.Directory)%(LessFile.FileName).css&quot;" Importance="high" />

    <Exec Command="&quot;$(DotLessCompilerPath)&quot; &quot;%(LessFile.FullPath)&quot; &quot;%(LessFile.RootDir)%(LessFile.Directory)%(LessFile.FileName).css&quot; -compress"  />

    <Message Text="" Importance="high" />
    <Message Text="------------------------------------------------------------" Importance="high" />
    <Message Text="" Importance="high" />
  </Target>
</project>

$(SolutionDir)Build\lessc.cmd
>>>>“%(LessFile.RootDir)%(LessFile.Directory)%(LessFile.FileName.css”“重要性=“高”/>
Build文件夹中创建了整个文件后,需要修改ASP.NET应用程序项目文件(即.csproj)。要修改项目文件,需要在Visual Studio IDE中卸载项目(右键单击解决方案资源管理器中的项目节点并选择“卸载项目”)

现在,再次右键单击卸载的项目并选择“编辑项目文件”。转到项目文件末尾,在
之前添加以下XML代码:

<Import Project="$(SolutionDir)Build\less.targets" />


最后,在Visual Studio中重新加载ASP.NET项目,构建它,如果一切顺利,您将为任何ASP.NET project LESS(.LESS)文件找到一个“.css”对应项!

我在项目中手动安装了LESS.NET,这是我的预构建事件:

If "$(ConfigurationName)" == Debug (
FOR %%i IN ("$(ProjectDir)css\*.less") DO ("$(ProjectDir)Tools\dotless.Compiler.exe" "%%i" )
) Else (
FOR %%i IN ("$(ProjectDir)css\*.less") DO ("$(ProjectDir)Tools\dotless.Compiler.exe" -m "%%i" )
)

此代码将查看css文件夹,并将所有.less文件转换为css文件,当项目处于调试模式时,css将可读,否则会被压缩。不要忘记更改路径,使其在您的环境中工作。如果.less文件中有错误,错误和行号将显示在输出窗口中。

也许我这不是你想要的……但你会发现使用官方JavaScript编译器编译更少的代码会有更好的体验。在我的例子中,我使用Windows脚本主机实现了它,并且我也将它集成到了构建过程中。@MatíasFidemraizer愿意分享你的解决方案吗?@DejanS让我检查一下是否可以用我可以解释的方式轻松分享这是一个简单的操作方法…@DejanS检查我的答案。这对我来说很有效,我在一些项目中使用它,效果很好!;)@DejanS我编辑了你的问题,并补充说,除了使用DotLess,你还可以学习其他方法。@Dejan.S我想指出,你要求我分享我的解决方案,而你什么也没说。如果我给你u另一个选择是因为使用官方LESS编译器会更好,因为它有最新的改进,而使用DotLess意味着DotLess应该始终与LESS的官方实现同步。但这取决于你,我希望我的答案对其他人有用。@MatíasFidemrAzer事实上,DotLess已经修复了一些错误t仍然在官方的LESS编译器中。@ZippyV如果有一个可行的,我宁愿远离非官方的实现!但这取决于你和OP。@MatíasFidemraizer感谢这个解决方案,+1,它很好,我相信人们会发现它真的很有用(我将在下一个项目中试用它)。我之所以没有评论它的时间不足不是故意的。对我来说,这是一个解决方案,因为它的基础工作已经完成,只是缺少了预构建脚本修复。@Dejan.S好的,谢谢!我这么说是因为我必须为您调整一些东西,以便使其可共享。
<Import Project="$(SolutionDir)Build\less.targets" />
If "$(ConfigurationName)" == Debug (
FOR %%i IN ("$(ProjectDir)css\*.less") DO ("$(ProjectDir)Tools\dotless.Compiler.exe" "%%i" )
) Else (
FOR %%i IN ("$(ProjectDir)css\*.less") DO ("$(ProjectDir)Tools\dotless.Compiler.exe" -m "%%i" )
)