2016-01-29 5 views
2

Дано:Как проверить, установлен ли конкретный компонент Android SDK или не с помощью командной строки

  • я установил Android SDK доступен в PATH
  • Я установил некоторые компоненты по идентификатору (например, android-23, extra-android-support, sys-img-armeabi-v7a-android-19 и т.д.), используя команду android update sdk -u -a -t some-ids

Вопрос:

Как проверить использование командной строки, если эти компоненты установлены или нет, на основе тех же идентификаторов, которые я установил?

Бонус: Это может быть сделано без подключения к интернету


Я собираюсь использовать его в моем анзибль Playbook сценария. Мне нужно, чтобы избежать выполнения команды установки, если они уже существуют для idempotency. Хотя android update sdk не будет устанавливать уже установленные элементы, он всегда запрашивает удаленный андроидный репозиторий заранее, что будет лишним накладным.

ответ

2

Я знаю, что это довольно старый вопрос, но я столкнулся с той же проблемой некоторое время и не смог найти ответ.

Таким образом, я сделал это в своей собственной роли (здесь: «android_sdk»), используя локальные факты.
шаги, которые необходимо сделать, это:

  1. Собирают некоторую переменную из локальных фактов (в, например, по умолчанию/main.yml.):

    android_sdk_installed: "{{ ansible_local.android_sdk.sdks_installed 
              if (ansible_local|d() and ansible_local.android_sdk|d() and 
               ansible_local.android_sdk.sdks_installed|d([])) 
              else [] }}" 
    
  2. Установка особых SDKs/встроенные инструменты/и т.д.

    - name: Install Android SDKs for applicable releases 
        shell: /bin/bash -l -c 'echo y | android -s update sdk -u -a -t "{{ item }}"' 
        with_items: 
        - "{{ android_sdk_tools }}" 
        when: item not in android_sdk_installed 
        register: sdk_install_res 
    

    Где android_sdk_tools представляет собой, например, чтобы установить:

    android_sdk_tools: 
        - "build-tools-23.0.2" 
        - "build-tools-19.1.0" 
    
  3. Изменить локальную переменную android_sdk_installed (я знаю, что это очень некрасиво - это только для фильтрации выходного сигнала из предыдущего шага для чистого зрения)

    - name: Set local android_sdk_installed fact 
        set_fact: android_sdk_installed="{{ android_sdk_installed|d([]) + [item.item|d()] }}" 
        with_items: | 
        {% set items=[] %} 
        {% for item in sdk_install_res.results %} 
        {% if item.item is defined %}{% if item.rc is defined %} 
        {% if items.append({'item':item.item,'rc':item.rc}) %}{% endif %} 
        {% endif %}{% endif %} 
        {% endfor %} 
        {{ items | to_nice_json }} 
        when: sdk_install_res is defined and item.rc == 0 
    
  4. Сохранить локальные факты (она основана на код из DebOps Ansible project)

    - name: Make sure that Ansible local facts directory is present 
        file: 
        path: '/etc/ansible/facts.d' 
        state: 'directory' 
        owner: 'root' 
        group: 'root' 
        mode: '0755' 
    
    - name: Save android_sdk local facts 
        template: 
        src: 'etc/ansible/facts.d/android_sdk.fact.j2' 
        dest: '/etc/ansible/facts.d/android_sdk.fact' 
        owner: 'root' 
        group: 'root' 
        mode: '0644' 
        register: android_sdk_register_local_facts 
    
    - name: Gather facts if they were modified 
        action: setup 
        when: android_sdk_register_local_facts.changed 
    

    Если содержимое файла шаблона "android_sdk.fact.j2 "является:

    {% set android_sdk_tpl_sdks_installed = [] %} 
    {% if (ansible_local|d() and ansible_local.android_sdk|d() and 
         ansible_local.android_sdk.sdks_installed|d()) %} 
    {% for element in ansible_local.android_sdk.sdks_installed %} 
    {%  set _ = android_sdk_tpl_sdks_installed.append(element) %} 
    {% endfor %} 
    {% endif %} 
    {% for element in android_sdk_installed or [] %} 
    {%  set _ = android_sdk_tpl_sdks_installed.append(element) %} 
    {% endfor %} 
    { 
    "sdks_installed": {{ android_sdk_tpl_sdks_installed | unique | sort | to_nice_json }} 
    } 
    

Надеюсь, что это помогает, ура!)