指南针:从另一个项目目录导入文件

时间:2013-02-01 23:03:36

标签: sass compass-sass

我有两个项目。一个是面向公众的网站,另一个是管理方面。我在两个页面上都有相同的页面。

我的目录结构如下:

/public
  config.rb
  /images
    /upgrade
      /sprites
  /sass
    /upgrade
        index.scss
  /stylesheets

/cms
  config.rb
  /sass
    /upgrade
        index.scss
  /stylesheets

public/sass/upgrade/index.scss是所有风格的所在。 cms/sass/upgrade/index.scss导入这些样式,如下所示:

@import '../../../public/sass/upgrade'

这些工作正常,我可以生成cms/stylesheets/upgrade/index.css的CSS。我正在遇到sprite生成问题。在public/sass/upgrade/index.scss内部,sprite png的导入看起来像这样

@import 'upgrade/sprites/*.png';

使用LiveReload,我收到以下错误:

Cannot determine the opposite position of: to
Cannot determine the opposite position of: to
Cannot determine the opposite position of: to
No files were found in the load path matching "setup/packages/*.png". Your current load paths are: ./images

这是有道理的,因为当我编译我的cms/sass/upgrade/index.scss时,它在cms/images/upgrade/sprites中寻找没有的图像。

我很想知道是否有人遇到过这个问题并且有任何解决方案如何跨项目共享资产。我认为设置relative_assets = true会有所帮助,但事实并非如此。也许我错了。我不知道。

1 个答案:

答案 0 :(得分:1)

我确信cimmanon建议创建符号链接应该有效。你确定你做得对吗?为了安全起见,请使用绝对路径。

你的项目结构有点搞笑,我没能完全理解它,所以我无法给你精确的符号链接位置和目标。如果您希望我们为您提供准确的路径,请通过以下方式更新您的问题:

  1. 您将符号链接放在哪里,指向您尝试编译时出现的错误;
  2. 更详细的项目结构(涉及的文件的完整内容将有所帮助)。
  3. UPD:确保您的Apache配置已启用FollowSymLinks,并且PHP配置包含include_path中的所有项目目录。

    如果你放弃,你可以使用我刚刚发明的讨厌的黑客。 :d

    我们的想法是创建一个自定义SASS函数,该函数根据调用的项目返回不同的结果。这将允许从public/sass/upgrade/index.scss导入不同的路径,具体取决于您正在编译的项目。

    public/config.rb中,添加:

    # Assign a name to the project and pass it into SASS
    $project_name = "public"
    module Sass::Script::Functions
      def project_name
        Sass::Script::String.new($project_name)
      end
    end
    

    cms/config.rb的添加非常相似。唯一的区别是$ project_name的值:

    # Assign a name to the project and pass it into SASS
    $project_name = "cms"
    module Sass::Script::Functions
      def project_name
        Sass::Script::String.new($project_name)
      end
    end
    

    之后,修改public/sass/upgrade/index.scss中的导入行:

    @if project-name() == public {
      @import 'upgrade/sprites/*.png';
    } @else if project-name() == cms {
      @import '../../../public/upgrade/sprites/*.png';
    }
    

    我的示例中的导入路径是弯曲的,请调整它们以符合您的环境。

    UPD2: @import指令不允许在@if等控制指令中使用。所以你可以使用:

    @if project-name() == public {
      $path: 'upgrade/sprites/*.png';
    } @else if project-name() == cms {
      $path: '../../../public/upgrade/sprites/*.png';
    }
    @import #{$path};
    
相关问题