我正在编写一个基于 commons-io 的 Groovy 脚本,它监视某个源目录并将其文件与某个目标目录同步。
@Grab(group='commons-io', module='commons-io', version='2.4')
import org.apache.commons.io.monitor.*
import org.apache.commons.io.FileUtils
class BaseSynchronizedFileListener extends FileAlterationListenerAdaptor {
def srcDir
def destDir
/* Given a source file, returns the destination file */
File destination(File file) {
new File(destDir, file.getAbsolutePath() - srcDir.getAbsolutePath())
}
}
class CopyOnWriteListener extends BaseSynchronizedFileListener {
@Override
void onFileChange(File file) {
FileUtils.copyFile(file, destination(file))
}
@Override
void onFileCreate(File file) {
FileUtils.copyFile(file, destination(file))
}
}
class DeleteOnDeleteListener extends BaseSynchronizedFileListener {
@Override
void onFileDelete(File file) {
FileUtils.deleteQuietly(destination(file))
}
}
除了直接的文件复制,我想支持 Less->CSS 编译,其中源目录中的文件与目标目录中的文件.less
同步。.css
@Grab(group='org.lesscss', module='lesscss', version='1.3.3')
import org.lesscss.LessCompiler
class CompileLessOnWriteListener extends BaseSynchronizedFileListener {
def compiler = new LessCompiler()
@Override
File destination(File file) {
File dest = super.destination(file)
new File(dest.parentFile, dest.name - '.less' + '.css')
}
void compile(File less) {
compiler.compile(less, destination(less))
}
@Override
void onFileChange(File less) {
compile(less)
}
@Override
void onFileCreate(File less) {
compile(less)
}
}
我遇到的问题是当我尝试创建类DeleteCssOnDeleteLessListener
来处理.less
文件被删除时的情况(这反过来又会删除相应的.css
文件)——我需要执行此操作的代码存在于两个不同的继承树中。
CompileLessOnWriteListener
包含destination()
方法DeleteOnDeleteListener
包含onFileDelete()
删除该方法返回的CSS文件的destination()
方法
是否有一种“Groovy 方式”可以选择性地将这两个类的方法混合或继承到一个新类中?
还是我只需要硬着头皮为 and 创建一个通用的超CompileLessOnWriteListener
类DeleteCssOnDeleteLessListener
?