sass-maven-plugin does not compile scss files

时间:2015-09-14 15:50:04

标签: maven sass

I try to integrate scss conversion into our existing maven project.

I tried to add

<plugin>
    <groupId>nl.geodienstencentrum.maven</groupId>
    <artifactId>sass-maven-plugin</artifactId>
    <version>${maven.sass.plugin.version}</version>
    <executions>
        <execution>
            <id>generate-css</id>
            <phase>generate-resources</phase>
            <goals>
                <goal>update-stylesheets</goal>
            </goals>
            <configuration>
                <sassOptions>
                    <always_update>true</always_update>
                </sassOptions>
                <includes>
                    <include>${scssSourceInclude}</include>
                </includes>
                <sassSourceDirectory>${project.basedir}/src/main/webapp/scss</sassSourceDirectory>
                <destination>${project.build.directory}/${project.build.finalName}/css</destination>
                <!-- <destination>${project.basedir}/src/main/webapp/css</destination> -->
            </configuration>
        </execution>
    </executions>
</plugin>

When I run mvn clean install command, it compiles correctly for destination which is set to "target" directory:

[INFO] --- sass-maven-plugin:2.12:update-stylesheets (generate-css) @ ui.web ---
[INFO] Checked 1 files for d:\work\git\repository\project\src\main\webapp\scss
[INFO] Checked 0 files for d:\work\git\repository\project\target\ui.web\css
[INFO] Compiling Sass templates
[INFO] No resource element was specified, using short configuration.
[INFO] Queueing Sass template for compile: d:\work\git\repository\project/src/main/webapp/scss => d:\work\git\repository\project/target/ui.web/css
...

In case of using second (commented) destination it skips scss compilation:

[INFO] --- sass-maven-plugin:2.12:update-stylesheets (generate-css) @ ui.web ---
[INFO] Checked 1 files for d:\work\git\repository\project\src\main\webapp\scss
[INFO] Checked 959 files for d:\work\git\repository\project\src\main\webapp\css
[INFO] Skip compiling Sass templates, no changes.

The only difference is that I need generated css files in src directories due to further processing (minification, concatenation, adding licence header, etc.)

Dir structure:

src
  |-main
    |-webapp
      |-scss
        |- common.scss
        |- app.scss
        |- admin
          |- admin.scss
      |-css

Can somebody explain to me why the files are not processed into src directories? Is there some missing configuration which I should apply?

2 个答案:

答案 0 :(得分:0)

我认为您的问题可以通过升级2.22或更高版本来解决。原因如下:

使用<destination>${project.basedir}/src/main/webapp/css</destination>构建的控制台输出显示目标目录中已有959个文件。鉴于src/main/webapp/scss中只有一个文件,我假设src/main/webapp/css中的大多数959文件都是普通的非生成CSS文件,并且您打算添加插件生成的文件。

查看插件的来源,在2.22之前的版本中,在源目录和目标目录中存在文件的条件是源目录树的文件比目标目录中的任何文件都要小。有关2.12实施,请参阅UpdateStylesheetsMojo#buildRequired()。请注意,插件不会按名称比较源文件和目标文件,只会比较“极端”时间戳。我怀疑跳过编译的构建在src/main/webapp/scss中找不到比src/main/webapp/css中的所有文件更年轻的文件。您可以通过在构建之前修改其中一个.scss文件来测试我的假设。 Issue #136: Wrong "build required" analysis when source and destination are the same描述了一个非常类似的问题。这是由版本2.22的pull request #137: add css filter at destination when checking buildrequired解决的。这应该使您的构建实际上编译.scss文件,即使面对目标目录中较新的.css文件。

退一步,我建议不要在构建期间修改src/。如Introduction to the Standard Directory Layout

中所述
  

src目录包含用于构建项目的所有源材料[...]

,而

  

target目录用于存放构建的所有输出。

行为是围绕这个惯例建立的。例如mvn clean删除target/(或更一般地${project.build.directory})。它不会尝试删除src/中生成的文件。看一下开发人员对上述问题的回复,很明显该插件的开发者分享了这种观点:

  

为什么有人想要混合源代码和编译代码?

考虑到这个约定,我建议你将.scss文件移动到src/main/sass(默认值sassSourceDirectory)并让插件输出.css文件到例如${project.build.directory}/generated-css-resourcessrc/main/webapp/css。然后让插件处理缩小,连接和许可标头在此目录以及${project.build.directory}/aggregated-css上运行。如果他们不支持配置,你仍然可以通过两次插件执行来实现这一点,每个目录一个。另一种方法是在Maven Resources Plugin's copy-resources goal的帮助下将生成的和未生成的.css文件聚合在目录GROUP BY中,确保生成的文件首先出现,以避免出现初始问题,并将此目录用作输入进一步处理。我确信还有其他方法可以解决这个问题。

答案 1 :(得分:0)

我不确定解决方案,但我尝试了这篇文章https://github.com/jruby/jruby/issues/2498中提到的解决方法,它对我有用。

基本上将sass-maven-plugin版本降级到2.0,它应该可以正常工作。