如何在Kotlin DSL中有条件地接受Gradle构建扫描插件服务条款?

时间:2019-04-17 10:34:30

标签: gradle kotlin gradle-kotlin-dsl kotlin-dsl

这基本上将this question扩展到Kotlin DSL,而不是Groovy DSL:

Groovy DSL solution

if (hasProperty('buildScan')) {
    buildScan {
        termsOfServiceUrl = 'https://gradle.com/terms-of-service'
        termsOfServiceAgree = 'yes'
    }
}

要翻译成Kotlin DSL吗?

我正在运行的问题是“ buildScan”扩展名或com.gradle.scan.plugin.BuildScanExtension类不能静态使用,因为它们是否存在取决于是否提供了--scan命令行参数或不摇篮。

我尝试过

if (hasProperty("buildScan")) {
    extensions.configure("buildScan") {
        termsOfServiceUrl = "https://gradle.com/terms-of-service"
        termsOfServiceAgree = "yes"
    }
}

但是按预期termsOfServiceUrltermsOfServiceAgree无法解析,但是我不知道在这里使用什么语法。

2 个答案:

答案 0 :(得分:2)

这不是很好,但是使用反射可以起作用:

if (hasProperty("buildScan")) {
    extensions.configure("buildScan") {
        val setTermsOfServiceUrl = javaClass.getMethod("setTermsOfServiceUrl", String::class.java)
        setTermsOfServiceUrl.invoke(this, "https://gradle.com/terms-of-service")

        val setTermsOfServiceAgree = javaClass.getMethod("setTermsOfServiceAgree", String::class.java)
        setTermsOfServiceAgree.invoke(this, "yes")
    }
}

答案 1 :(得分:1)

Gradle Kotlin DSL提供了public class GetHouseDetailsViewModel extends AndroidViewModel { //The data we fetch from asynchronously private MutableLiveData<List<DecodeHouseDetails>> mHouseDetailsList; private GetHouseDetailsRepository mHouseDetailsRepository; public GetHouseDetailsViewModel(@NonNull Application application) { super(application); } public void init(){ if(mHouseDetailsList != null){ mHouseDetailsList= new MutableLiveData<>(); } mHouseDetailsRepository = GetHouseDetailsRepository.getInstance(); //Initialize the repository mHouseDetailsList = mHouseDetailsRepository.getHouseDetails(this.getApplication()); } public LiveData<List<DecodeHouseDetails>> getHouseInfo() { if(mHouseDetailsList == null){ mHouseDetailsList = new MutableLiveData<>(); } return mHouseDetailsList; } } 实用程序扩展,该扩展将Groovy元编程语义附加到任何对象。参见official documentation

public class AdmManageHouses extends Fragment {
    private ProgressBar progressloader,progressloader_large;
    SwipeRefreshLayout refreshLayout;
    private TextView house_number_text,house_title_text,house_name_text;
    private GetHouseDetailsViewModel mHouseDetailsViewModel;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.tab1_manage_houses, container, false);
        mHouseDetailsViewModel = ViewModelProviders.of(getActivity()).get(GetHouseDetailsViewModel.class);

        //Innitialize objects
        house_title_text= rootView.findViewById(R.id.house_title);
        house_number_text= rootView.findViewById(R.id.house_number);
        house_name_text= rootView.findViewById(R.id.house_name);

        //Initialize the view model
        mHouseDetailsViewModel.init();
        mHouseDetailsViewModel.getHouseInfo().observe(getViewLifecycleOwner(), new Observer<List<DecodeHouseDetails>>() {
            @Override
            public void onChanged(List<DecodeHouseDetails> decodeHouseDetails) {
                for(int i=0; i<decodeHouseDetails.size(); i++) {
                    house_number_text.setText(String.valueOf(decodeHouseDetails.get(i).getHouse_number()));
                    house_title_text.setText(decodeHouseDetails.get(i).getHouse_name());
                    house_name_text.setText(decodeHouseDetails.get(i).getHouse_name());
                }
            }
        });

        //Refresh on swipe
       refreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                initializeDashboard();
                refreshLayout.setRefreshing(false);
            }
        });

        initializeDashboard();
        return rootView;
    }

    private void initializeDashboard() {
        for(int i=0; i<mHouseDetailsViewModel.getHouseInfo().getValue().size(); i++) {

            house_number_text.setText(String.valueOf(mHouseDetailsViewModel.getHouseInfo().getValue().get(i).getHouse_number()));
            house_title_text.setText(mHouseDetailsViewModel.getHouseInfo().getValue().get(i).getHouse_name());
            house_name_text.setText(mHouseDetailsViewModel.getHouseInfo().getValue().get(i).getHouse_name());
        }
    }
}

这最终像Groovy一样进行了反射,但是使脚本更加整洁。