【问题标题】:Functions may not be defined within control directives or other mixins不能在控制指令或其他混入中定义函数
【发布时间】:2016-08-15 00:25:58
【问题描述】:

在我的 nodeJS 项目中突然出现错误。我没有进行任何升级或更改。 当我在命令行中编写 NPM start 时,它会给出该错误

 ERROR in ./~/css-loader?sourceMap!./~/postcss-loader!./~/sass-loader?
sourceMap&outputStyle=expanded&includePaths[]=c:/TFS/rc1/app/scss&includePaths[]

=c:/TFS/rc1/~/compass-mixins/lib&sourceMap&sourceMapContents=true!./app/scss/_toolkit.scss
    Module build failed:
    undefined
     ^
          Functions may not be defined within control directives or other mixins.
          in c:\TFS\rc1\node_modules\compass-mixins\lib\compass\functions\_lists.scss (line 81, column 3)
     @ ./app/scss/_toolkit.scss 4:14-337

我重新安装了 compass-mixins 包,但仍然报同样的错误。然后我在 81 行查看了 _lists.scss 该文件有一个代码。我删除了它,但它给出了同样的错误。我该怎么办?

@if not(function-exists(compact)) {
  @function compact($vars...) {
    $list: ();
    @each $var in $vars {
        @if $var {
            $list: append($list, $var, comma);
        }
    }
    @return $list;
  }
}

【问题讨论】:

  • 你使用的是 LibSass 还是官方的 Ruby Sass?
  • 这是 react js 项目而不是 ruby​​ 项目。如何检查它是 libsass 还是 ruby​​ sass?
  • 我不熟悉你正在使用的任何其他东西,但对于 Unix 或 Mac OS,在终端中运行 sass -v 至少可以确认你已经安装了 Ruby Sass。
  • @cimmanon 我使用的是 windows 8。我尝试 sass -v 它不起作用。你建议 mi 检查是否安装了 sass?
  • 不幸的是,我不使用 Windows 进行开发(我在 Windows 主机中使用 unix 虚拟机)。我使用 Ruby Sass 和 LibSass 运行了提供的代码,我只在 Ruby Sass 版本中得到错误......所以我有点困惑为什么你会使用 compass-mixins 库而不是仅仅使用 Compass(他们'不是一回事)如果你使用的是 Ruby Sass。

标签: node.js npm sass compass-sass npm-install


【解决方案1】:

我正在使用 Gulp。 gulp-sass 2.3.0 版打破了它。回到 2.2.0 版本,一切都解决了。

编辑:

真正的罪魁祸首是“gulp-sass”节点模块中的节点模块,称为“node-sass”。您可以在“gulp-sass”的 package.json 文件中看到它只是拉取大于 ^3.5.3 的版本。

即使您像我之前建议的那样返回并将“gulp-sass”重新安装到 2.2.0,其中的 package.json 文件仍然会拉取大于 ^3.5.3 的“node-sass”。

如果我使用旧版本的“node-sass”3.4.2,该错误就会消失。我不知道如何以自动化的方式解决这个问题。在紧要关头,我能够通过从另一个有效的项目复制该文件夹(即使用 3.4.2)来解决问题。现在它可以编译了。

比我聪明的人能想出一个更好的方法来完成这个结果吗?

【讨论】:

  • 你能给出命令吗。我是.net开发者我是节点js -npg envirmont的新手
  • 你能解释一下这是如何解决问题的吗?如果函数最终被限定在 if 语句内,那么简单地删除错误消息将无济于事。
  • 正确。它并没有“解决”问题。这是使用 Node 模块的固有风险。每个节点模块(不仅仅是 gulp-sass)都有自己的 package.json 文件。那将总是比 ^x.x.x 拉得更大。从长远来看,分叉在其他地方维护的代码总是一个坏主意。它确实为我们今天“解决”了问题,这很重要。但根本问题是由于缺乏对子子依赖项的控制,使用 Node(出于我们的目的)的固有风险。
  • 另外我想指出我们使用特定版本的“node-sass”不是根本问题。它实际上是它调用的 compass-mixin。显然 Libsass 在允许的范围内变得更加严格。因此出现错误消息“无法在控制指令或其他混合中定义函数”。他们过去常常让这些东西滑落,但现在不行了。
  • 对不起 - 实际上添加 "node-sass": "3.4.2" 确实有效。但请注意不要像我第一次那样粗心地输入"^3.4.2"。 '因为那行不通。
【解决方案2】:

我也面临类似的问题。我的项目正在使用gulp-sasscompass-mixins。正如 heart.cooks.mind 指出的那样,gulp-sass 取决于node-sass。并且node-sass 将其依赖之一libsass 升级到版本libsass 3.3.3 Delorean,因为node-sass 3.5.1

但是,libsass 3.3.3 Delorean 的其中一项更改与此问题有关:
'Disallow functions to be defined in control directives or mixins (@mgreter, #1550)'

显然,compass-mixins 中的 _lists.scss 打破了这条规则。似乎有人将issue 提高到compass-mixins 并且他们有修复它的想法。

compass-mixins发布问题修复版本之前,我的临时解决方法是手动删除node_modules/node-sass并npm install node-sass@3.4.2

【讨论】:

  • 对于那些使用自动构建的人来说,这不是一个真正的选择。在package.json 中添加"node-sass": "3.4.2"devDependencies 是一个更好的调用。解决重大更改后,只需删除该行即可。
【解决方案3】:

我也遇到了同样的问题,请参考node sass release 3.5.3 is breaking build并通过shrinkwrap强制锁定gulp-sass使用特定的node sass库,避免使用有bug的node sass版本

【讨论】:

    【解决方案4】:

    我(暂时)做的是全局安装 node-sass v3.4.2,然后用这个旧版本替换 node-sass 的 gulp-sass 版本(它位于 gulp-sass/node_modules 中)。

    sudo npm install -g node-sass@3.4.2;
    sudo cp -r /usr/lib/node_modules/node-sass/ /usr/lib/node_modules/gulp-sass/node_modules/;
    

    【讨论】:

      【解决方案5】:

      顺便说一句,这里有一个PR waiting to be merged。但是,如果您今天想使用它,那么还有 a fork of the merge
      如果您想使用后者,只需将compass-mixins: tjenkinson/compass-mixins 放入您的package.json 中,一切都会好起来的。

      更新:- 现在PR 中提到的后者还有一个 npm 包

      更新 2:- 这应该不再是 v0.12.8 的问题了

      【讨论】:

      • 升级到 0.12.8 为我解决了这个问题。
      猜你喜欢
      • 1970-01-01
      • 2018-10-05
      • 1970-01-01
      • 2015-08-08
      • 1970-01-01
      • 2023-03-13
      • 2016-04-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多