Ruby on rails Rails:由于缺少变量,资产未在Capistrano部署步骤上预编译

Ruby on rails Rails:由于缺少变量,资产未在Capistrano部署步骤上预编译,ruby-on-rails,sass,capistrano,asset-pipeline,Ruby On Rails,Sass,Capistrano,Asset Pipeline,我在为正在开发的新Rails 6应用程序预编译资源时遇到了一些问题 我的应用程序.scss如下所示: @import 'vars'; @import 'bootstrap'; @import 'bootstrap_overrides'; @import 'font_awesome5.css'; @import 'base'; @import 'dashboard'; # etc... 但在使用Capistrano部署到生产环境中时,资产预编译步骤失败,原因如下: SassC::SyntaxEr

我在为正在开发的新Rails 6应用程序预编译资源时遇到了一些问题

我的
应用程序.scss
如下所示:

@import 'vars';
@import 'bootstrap';
@import 'bootstrap_overrides';
@import 'font_awesome5.css';
@import 'base';
@import 'dashboard';
# etc...
但在使用Capistrano部署到生产环境中时,资产预编译步骤失败,原因如下:

SassC::SyntaxError: Error: Undefined variable: "$padding"
       on line 18:12 of app/assets/stylesheets/base.scss
>>   padding: $padding;

   -----------^
$padding
变量在
vars.scss
中定义:

$padding: 60px 0px;
如前所述,正在
application.scss
中导入。如果
application.scss
已经在导入它,为什么其他文件会抱怨它是必需的

该应用程序在开发中运行良好


提前谢谢

EDIT:vmarquet在回答类似问题时给出了更好的答案

总结一下vmarquet的答案,最新版本的sprockets默认将资产/样式表中的所有scss文件编译为顶级资产。您想要的是编译application.scss文件,而不是独立编译所有部分和导入

这是在manifest.js中配置的。您需要的不是默认的目录include,而是以下内容:

@import 'vars';
@import 'bootstrap';
@import 'bootstrap_overrides';
@import 'font_awesome5.css';
@import 'base';
@import 'dashboard';
# etc...
/=链接树../images
//=link application.css
//=link application.js

我认为编译器在将每个文件导入application.js之前都会自己编译,因此在导入之前需要变量。因此,它获取base.scss文件并对其进行解析,但它不知道$padding是否存在,因此它会抛出一个错误。
vars
import on application.scss仅替换该文件上的变量,而不是来自导入文件的变量。具有完全相同的问题。在开发中工作,而不是在生产中(heroku)。到目前为止找到了解决方案吗?@thomas/DaniG2k你们中的任何一个找到问题所在了吗?我也在经历同样的事情。谢谢@不幸的是,我仍然有这个问题。如果你找到一个解决方案,请张贴以及。我停止使用scss变量,因为对我来说它只是一个变量。