В чем разница между рефактором Android Studio и базовым поиском / заменой? - PullRequest
0 голосов
/ 08 января 2019

Я пытаюсь изменить имя пакета в Android Studio с generic_app на app_name.

Я мог бы использовать инструмент «Refactor» из Android Studio, но я пытаюсь сделать это с помощью скрипта Python. Однако когда я выполняю поиск и замену, а затем открываю свой проект в Android Studio, имя моего пакета не меняется. Вызовы app_name используются в моих действиях и фрагментах, но имя пакета остается прежним.

Даже после сборки проекта очистки / перестройки некоторые «сгенерированные» вещи остаются со старым именем пакета.

Чем именно отличается инструмент Refactor в Android Studio от внешнего поиска и замены?

Как мне этого добиться?

Вот мой код на Python (я начал сегодня, извините, если код ужасный, не стесняйтесь дать мне несколько советов):

import os
import sys
import fileinput

sys.argv = [sys.argv[0], 'appName', 'package_name', '123', 'api_address']

def main():
    cls()
    print("Starting compiler...")
    if (len(sys.argv) > 4):
        print("")
        print("App name                  : {}".format(sys.argv[1]))
        print("Package name              : {}".format(sys.argv[2]))
        print("Establishment ID          : {}".format(sys.argv[3]))
        print("Establishment api address : {}".format(sys.argv[4]))
        input("\nPress any key to confirm")
        setup(sys.argv[1])
        refactor_package(sys.argv[1])
        change_app_name(sys.argv[2])
        set_establishment_id(sys.argv[3])
        set_establishment_api_address(sys.argv[4])
    else:
        print("Incorrect use.")
        print(".\\autocompiler.py app_name package_name establishment_id establishment_api_address")
    os.chdir('..')
    message = "\nPress any key to close"
    choice = input(message).upper()

def setup(app_name):
    command = ""
    if (os.name == 'nt'):
        command = "robocopy /E generic_app {}".format(app_name)
    else:
        command = "cp -rf ./generic_app {}".format(app_name)
    os.system(command) # Will copy generic_app in a new project folder
    os.chdir(app_name)  # Will go in the created directory
    command = "gradlew clean"
    os.system(command)  # Clear .build directory
    command = "gradlew cleanBuildCache"
    os.system(command)  # Clear .build cache directory

    # Refactor ; change establishment ID && API address ; build

def refactor_package(package_name):
    rootdir = os.getcwd()
    for root, subFolders, files in os.walk(rootdir):
        #print("ROOT == {}".format(root))
        for file in files:
            #print("\t\tFILE == {}".format(file))
            if (os.name == 'nt'):
                check_file(root + '\\' + file, package_name)
            else:
                check_file(root + '/' + file, package_name)
        for subFolder in subFolders:
            print("\t\tSUBFOLDER == {}".format(subFolders))

def check_file(filePath, packageName):
    if ("app\src\main\java\com\discodery\android" in filePath
        and ".git" not in filePath):
        print("OPENING FILE {}".format(filePath))
        with open(filePath, "r") as file:
            data = file.read()
            #print("---------- ORIGINAL ----------")
            #print(data)
            file = open(filePath, "w")
            file.write(data.replace("generic_app", packageName))
            #print("===== RESULT =====")
            file.close()
            file = open(filePath, "r")
            data = file.read()
            #print(data)
            file.close()
            # input("Press any key to continue")
    elif ("app\src\main\AndroidManifest.xml" in filePath):
        print("SHOULD EDIT MANIFEST")
        input("OK")
        with open(filePath, "r") as file:
            data = file.read()
            file = open(filePath, "w")
            file.write(data.replace('package="com.genericapp"', 'package="com.{}"'.format(packageName)))
            file.close()
    elif ("app\build.gradle" in filePath):
        print("SHOULD EDIT APP BUILD.GRADLE")
        input("OK")
        with open(filePath, "r") as file:
            data = file.read()
            file = open(filePath, "w")
            file.write(data.replace('applicationId "com.discodery.android.genericapp"', 'applicationId "com.discodery.android.{}"'.format(packageName)))
            file.close()

def change_app_name(app_name):
    pass

def set_establishment_id(establishment_id):
    pass

def set_establishment_api_address(api_address):
    pass

def cls():
    os.system('cls' if os.name == 'nt' else 'clear')

main()

1 Ответ

0 голосов
/ 09 января 2019

Опция Refactor IntelliJ - это действительно «найти и заменить». Это еще и нечто большее, в том смысле, что оно более мощное и многое ожидает. (Не говорите это вслух, но это может также вызвать побочные эффекты.)

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

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

И IDE предоставляет интерфейс для отказа от некоторых изменений в случае возникновения конфликтов. И т.п. Подробнее на https://www.jetbrains.com/help/idea/tutorial-introduction-to-refactoring.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...