将具有完全相同配置的许多 sourceSet 中的几个分组 [英] Grouping few of many sourceSets having exactly same configuration

查看:33
本文介绍了将具有完全相同配置的许多 sourceSet 中的几个分组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设我有以下 sourceSets:

sourceSets {
    flavor1 {
        assets.srcDirs = ['repo-assets/flavor1']
        res.srcDirs = ['repo-res/flavor1']
    }
    flavor2 {
        assets.srcDirs = ['repo-assets/flavor2']
        res.srcDirs = ['repo-res/flavor2']
    }
    flavor3 {
        assets.srcDirs = ['repo-assets/flavor1']
        res.srcDirs = ['repo-res/flavor1']
    }
    flavor4 {
        assets.srcDirs = ['repo-assets/flavor2']
        res.srcDirs = ['repo-res/flavor2']
    }
}

如果您注意到 flavor1flavor3 具有相同的 srcDirs,flavor2flavor4 也是如此.

If you notice flavor1 and flavor3 have same srcDirs and so does flavor2 and flavor4.

我试图弄清楚是否有办法通过使用这样的东西来避免冗余:

I was trying to figure out if there is a way to avoid the redundancy by using something like this:

sourceSets {
    flavor1, flavor3 {
        assets.srcDirs = ['repo-assets/flavor1']
        res.srcDirs = ['repo-res/flavor1']
    }
    flavor2, flavor4 {
        assets.srcDirs = ['repo-assets/flavor2']
        res.srcDirs = ['repo-res/flavor2']
    }
}

以上不行(已经试过了).寻找类似的东西,以便我可以为一组口味提供一组通用的 sourceDirs.有人尝试过做类似的事情并且可以提供一些指导吗?

The above does not work (already tried). Looking for something similar so that i can just provide a common set of sourceDirs for a set of flavors. Anyone tried doing something similar and can provide some pointers?

sourceSets 的名字需要和flavors 的名字一样吗?

Does the name of sourceSets need to be same as that of flavors?

我可以单独命名 sourceSets 然后像这样将它们映射到 productFlavors 吗?

Can i name the sourceSets separately and then map them to productFlavors like this?

productFlavors {
    flavor1 {
      sourceset = "src1"
    }
    flavor2 {
      sourceset = "src2"
    }
    flavor3 {
      sourceset = "src1"
    }
    flavor4 {
      sourceset = "src2"
    }
}

sourceSets {
    src1 {
    }
    src2 {
    }
}


尝试可能性#3

可以通过任务以某种方式动态分配源集以实现相同的东西吗?


Trying Possibility#3

Can the sourcesets be dynamically assigned via tasks somehow to achieve the same stuff?

Douglas 的 回答帮助我最终找到了我想要的东西(减少了 build.gradle 中的代码).他使用了上面的可能性#3.谢谢道格拉斯!赏金猎人的任何更好的选择仍然是受欢迎的(更接近上面的可能性 #1 和 #2).如果没有出现任何问题,那么当我接受他的回答时,赏金已经是道格拉斯的了.但仍会对寻找更好的替代方案保持乐观.

Douglas's answer sort of helped me get very close to what i was looking for eventually (reducing the code in build.gradle). He used Possibility#3 above. Thanks Douglas! Any better alternative from bounty hunters is still welcome (something closer to possibilities #1 and #2 above). If nothing comes up the bounty is Douglas's already when the period ends as I've accepted his answer. But still will remain optimistic about finding a better alternative.

推荐答案

你也很接近你的第一种可能性:

You were also pretty close with your first possibility:

sourceSets {
    [flavor1, flavor3].each {
        it.assets.srcDirs = ['repo-assets/flavor1']
        it.res.srcDirs = ['repo-res/flavor1']
    }
    [flavor2, flavor4].each {
        it.assets.srcDirs = ['repo-assets/flavor2']
        it.res.srcDirs = ['repo-res/flavor2']
    }
}

以上在IDEA编辑器中看起来不太好,显示了很多警告.如果你想获得代码完成,你可以设置类型:

The above doesn't look nice in IDEA editor, a lot of warnings are shown. You can set the type if you want to get code completion:

import com.android.build.gradle.api.AndroidSourceSet
android {
    sourceSets {
        [flavor2, flavor4].each { AndroidSourceSet ss ->
            ss.assets.srcDirs = ['repo-assets/flavor2']
            ss.res.srcDirs = ['repo-res/flavor2']
        }
    }
}

另一个技巧:通过这种方式,风味的定义与源集列表位于同一位置.

Another trick: this way the definition of the flavor is co-located with the source set listing.

android
    productFlavors {
        flavor1 {
            applicationId "flavor1.app.id"
        }
        flavor2 {
            applicationId "flavor2.app.id"
        }
        [flavor1, flavor2].each {
            sourceSets[it.name].assets.srcDirs = ['repo-assets/flavor1']
            sourceSets[it.name].res.srcDirs = ['repo-assets/flavor1']
        }
    }

无论你走哪条路,srcDirs 还有一个值得注意的地方,见源码:

Whichever way you go there's also a noteworthy thing about srcDirs, see source:

println assets.srcDirs // say it's [src/flavor/assets]
assets.srcDirs = ['dir1', 'dir2'] // overwrites existing directories: output would be [dir1, dir2]
assets.srcDirs 'dir1', 'dir2' // appends existing directories: output would be [src/flavor/assets, dir1, dir2]
assets.srcDir 'dir1' // appends only one dir, output would be [src/flavor/assets, dir1]

这篇关于将具有完全相同配置的许多 sourceSet 中的几个分组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆