MVC4 Less Bundle @import Directory

前端 未结 10 816
南方客
南方客 2020-12-12 17:02

I\'m trying to use MVC4 bundling to group some of my less files, but it looks like the import path I\'m using is off. My directory structure is:

static/
             


        
10条回答
  •  野趣味
    野趣味 (楼主)
    2020-12-12 17:42

    There is code posted on GitHub Gist that works well with @import and dotLess: https://gist.github.com/2002958

    I tested it with Twitter Bootstrap and it works well.

    ImportedFilePathResolver.cs

    public class ImportedFilePathResolver : IPathResolver
    {
        private string currentFileDirectory;
        private string currentFilePath;
    
        /// 
        /// Initializes a new instance of the  class.
        /// 
        /// The path to the currently processed file.
        public ImportedFilePathResolver(string currentFilePath)
        {
            CurrentFilePath = currentFilePath;
        }
    
        /// 
        /// Gets or sets the path to the currently processed file.
        /// 
        public string CurrentFilePath
        {
            get { return currentFilePath; }
            set
            {
                currentFilePath = value;
                currentFileDirectory = Path.GetDirectoryName(value);
            }
        }
    
        /// 
        /// Returns the absolute path for the specified improted file path.
        /// 
        /// The imported file path.
        public string GetFullPath(string filePath)
        {
            filePath = filePath.Replace('\\', '/').Trim();
    
            if(filePath.StartsWith("~"))
            {
                filePath = VirtualPathUtility.ToAbsolute(filePath);
            }
    
            if(filePath.StartsWith("/"))
            {
                filePath = HostingEnvironment.MapPath(filePath);
            }
            else if(!Path.IsPathRooted(filePath))
            {
                filePath = Path.Combine(currentFileDirectory, filePath);
            }
    
            return filePath;
        }
    }
    

    LessMinify.cs

    public class LessMinify : IBundleTransform
    {
        /// 
        /// Processes the specified bundle of LESS files.
        /// 
        /// The LESS bundle.
        public void Process(BundleContext context, BundleResponse bundle)
        {
            if(bundle == null)
            {
                throw new ArgumentNullException("bundle");
            }
    
            context.HttpContext.Response.Cache.SetLastModifiedFromFileDependencies();
    
            var lessParser = new Parser();
            ILessEngine lessEngine = CreateLessEngine(lessParser);
    
            var content = new StringBuilder(bundle.Content.Length);
    
            foreach(FileInfo file in bundle.Files)
            {
                SetCurrentFilePath(lessParser, file.FullName);
                string source = File.ReadAllText(file.FullName);
                content.Append(lessEngine.TransformToCss(source, file.FullName));
                content.AppendLine();
    
                AddFileDependencies(lessParser);
            }
    
            bundle.Content = content.ToString();
            bundle.ContentType = "text/css";
            //base.Process(context, bundle);
        }
    
        /// 
        /// Creates an instance of LESS engine.
        /// 
        /// The LESS parser.
        private ILessEngine CreateLessEngine(Parser lessParser)
        {
            var logger = new AspNetTraceLogger(LogLevel.Debug, new Http());
            return new LessEngine(lessParser, logger, false);
        }
    
        /// 
        /// Adds imported files to the collection of files on which the current response is dependent.
        /// 
        /// The LESS parser.
        private void AddFileDependencies(Parser lessParser)
        {
            IPathResolver pathResolver = GetPathResolver(lessParser);
    
            foreach(string importedFilePath in lessParser.Importer.Imports)
            {
                string fullPath = pathResolver.GetFullPath(importedFilePath);
                HttpContext.Current.Response.AddFileDependency(fullPath);
            }
    
            lessParser.Importer.Imports.Clear();
        }
    
        /// 
        /// Returns an  instance used by the specified LESS lessParser.
        /// 
        /// The LESS prser.
        private IPathResolver GetPathResolver(Parser lessParser)
        {
            var importer = lessParser.Importer as Importer;
            if(importer != null)
            {
                var fileReader = importer.FileReader as FileReader;
                if(fileReader != null)
                {
                    return fileReader.PathResolver;
                }
            }
    
            return null;
        }
    
        /// 
        /// Informs the LESS parser about the path to the currently processed file. 
        /// This is done by using custom  implementation.
        /// 
        /// The LESS parser.
        /// The path to the currently processed file.
        private void SetCurrentFilePath(Parser lessParser, string currentFilePath)
        {
            var importer = lessParser.Importer as Importer;
            if(importer != null)
            {
                var fileReader = importer.FileReader as FileReader;
    
                if(fileReader == null)
                {
                    importer.FileReader = fileReader = new FileReader();
                }
    
                var pathResolver = fileReader.PathResolver as ImportedFilePathResolver;
    
                if(pathResolver != null)
                {
                    pathResolver.CurrentFilePath = currentFilePath;
                }
                else
                {
                   fileReader.PathResolver = new ImportedFilePathResolver(currentFilePath);
                }
            }
            else
            {
                throw new InvalidOperationException("Unexpected importer type on dotless parser");
            }
    
    
        }
    }
    

提交回复
热议问题