SASSでは、別のディレクトリからファイルをインポートできますか?たとえば、次のような構造の場合:
- root_directory
- sub_directory_a
- _common.scss
- template.scss
- sub_directory_b
- more_styles.scss
template.scssは@import "common"
を使用して_common.scssをインポートできますが、more_styles.scssが_common.scssをインポートすることは可能ですか? @import "../sub_directory_a/common"
や@import "../sub_directory_a/_common.scss"
など、いくつかの異なることを試しましたが、何も機能しないようです。
SASSに対するいくつかの変更により、最初に試したことが可能になりました。
@import "../subdir/common";
c:\projects\sass
にあるまったく関係のないフォルダーでもこれが機能するようになりました。
@import "../../../../../../../../../../projects/sass/common";
十分な../
を追加するだけで、ドライブルートに到達し、準備完了です。
もちろん、この解決策はきれいではありませんが、I c:\projects\sass
を使用したり、環境変数SASS_PATH
を設定したりすることなく、まったく異なるフォルダーからインポートすることはできませんでした(from: :load_paths reference )同じ値に。
-I
コマンドラインスイッチまたはRubyコードの :load_paths
オプションを使用して、sub_directory_a
をSassのロードパスに追加できます。したがって、root_directory
からSassを実行している場合は、次のようにします。
sass -I sub_directory_a --watch sub_directory_b:sub_directory_b
その後、単に@import "common"
でmore_styles.scss
を使用できます。
Sass-loaderでwebpackを使用すると、〜を使用してプロジェクトのルートパスを参照できます。たとえば、OPsフォルダー構造で、sub_directory_b内のファイルにいると仮定します。
@import "~sub_directory_a/_common";
Sass-loader readmeのUsage/Importsを参照してください: https://github.com/webpack-contrib/sass-loader
相対的な位置が異なるネストされたインポートを持つ.scss
ファイルのインポートは機能しません。 (多くの../
を使用する)最上位の提案された答えは、プロジェクトのデプロイメントOSのルートに到達するのに十分な../
を追加する限り機能する単なる汚いハックです。
:load_paths
でconfig.rd
を使用して、コンパスベースのフレームワーク(例:Rails)に使用します
scss-config.json
にはfourseven/meteor-scss
で次のコードを使用します
{
"includePaths": [
"{}/node_modules/ionicons/dist/scss/"
]
}
たとえば、
fourseven/meteor-scss
を使用すると、{}
を使用して、次の例のようにプロジェクトの最上位レベルを強調表示できます。
@import "{}/node_modules/module-name/stylesheet";
選択された答えは実行可能なソリューションを提供しません。
OPの慣行は不規則に思えます。共有/共通ファイルは通常、標準のボイラープレートディレクトリであるpartials
の下にあります。次に、コードの任意の場所でパーシャルを解決するために、構成インポートパスにpartials
ディレクトリを追加する必要があります。
初めてこの問題に遭遇したとき、SASSはおそらくノードの__dirname
に似たグローバル変数を提供し、現在の作業ディレクトリ(cwd
)への絶対パスを保持していると考えました。残念ながら、それはできません。その理由は、@import
ディレクティブでの補間が不可能であるため、動的インポートパスを実行できないためです。
SASS docs によると。
Sass設定で:load_paths
を設定する必要があります。 OPはCompassを使用するため、ドキュメント here に従ってそれに従います。
CLIソリューションを目的どおりに使用できますが、なぜですか? config.rb
に追加する方がはるかに便利です。 config.rb
(たとえば、異なるビルドシナリオ)をオーバーライドするためにCLIを使用することは理にかなっています。
したがって、config.rb
がプロジェクトルートの下にあると仮定して、次の行を追加するだけです:add_import_path 'sub_directory_a'
そして今、@import 'common';
はどこでも問題なく動作します。
これはOPに答えますが、さらにあります。
CSSファイルを埋め込み方法でインポートする場合、つまり、CSSが標準で提供するVanilla @import
ディレクティブではなく、actualを使用してインポートする場合があります。 CSSファイルのコンテンツとSASSのマージ。別の question がありますが、これは決定的ではありません(ソリューションはクロス環境では機能しません)。その場合の解決策は、 this SASS拡張を使用することです。
インストールしたら、次の行を構成に追加します:require 'sass-css-importer'
そして、コードのどこかに@import 'CSS:myCssFile';
これを機能させるには、拡張子を省略する必要があることに注意してください。
ただし、デフォルト以外のパスからCSSファイルをインポートしようとすると、同じ問題が発生し、add_import_path
はCSSファイルを尊重しません。したがって、それを解決するには、設定にさらに別の行を追加する必要があります。
add_import_path Sass::CssImporter::Importer.new('sub_directory_a')
これですべてがうまく動作します。
追記:sass-css-importer
のドキュメントでは、CSS:
拡張子を省略することに加えて、.css
プレフィックスが必要であることがわかりました。関係なく動作することがわかりました。誰かが issue を開始しましたが、これまでのところ未回答のままです。
Gulpは、sassファイルを監視し、includePathsを使用して他のファイルのパスを追加するジョブを実行します。例:
gulp.task('sass', function() {
return gulp.src('scss/app.scss')
.pipe($.sass({
includePaths: sassPaths
})
.pipe(gulp.dest('css'));
});
インポートするファイルを定義するには、すべてのフォルダーの共通定義を使用できます。あなたはそれがあなたがそれを定義しているファイルに関連していることを意識する必要があります。インポートオプションの例と詳細については、 here を確認してください。
node-sass
(node.js
の公式SASSラッパー)は、そのような要件に役立つコマンドラインオプション--include-path
を提供します。
例:
package.json
::
"scripts": {
"build-css": "node-sass src/ -o src/ --include-path src/",
}
これで、プロジェクトにファイルsrc/styles/common.scss
がある場合、プロジェクトのどこにでも@import 'styles/common';
を使用してインポートできます。
詳細については、 https://github.com/sass/node-sass#usage-1 を参照してください。
IncludePathsパラメーターの使用を検討してください...
「SASSコンパイラは、SASS @importsを解決するときにloadPathsの各パスを使用します。」
これは半分の答えです。
コンパス をチェックして、_common.scss
をpartials
フォルダー内に配置し、@import common
でインポートできますが、すべてのファイルで機能します。
Visual Studioで Web Compiler を使用する場合、compilerconfig.json.defaultsでincludePath
にパスを追加できます。コンパイラーはインポートを探す場所としてincludePathを使用するため、いくつかの../
は必要ありません。
例えば:
"includePath": "node_modules/foundation-sites/scss",
私は同じ問題に遭遇しました。私のソリューションから、私はこれに入りました。コードは次のとおりです。
- root_directory
- sub_directory_a
- _common.scss
- template.scss
- sub_directory_b
- more_styles.scss
1つのscssを別のscssにインポートするかどうかは、部分的なものでなければなりません。別のディレクトリ名からmore_styles.scss
を_more_styles.scss
にインポートする場合。次に、この@import template.scss
のように../sub_directory_b/_more_styles.scss
にインポートします。それは私のために働いた。しかし、あなたが言ったように../sub_directory_a/_common.scss
は機能していません。これは、template.scss
と同じディレクトリです。それが動作しない理由です。
最良の方法は、ユーザーsass-loaderを使用することです。 npmパッケージとして入手可能です。すべてのパス関連の問題を解決し、非常に簡単にします。