{"meta":{"title":"Использование GitHub Copilot для миграции project на другой язык программирования","intro":"GitHub Copilot Chat может помочь переместить проект на другой язык. В этом руководстве описывается, что связано с процессом миграции и приведен пример миграции PHP в Python.","product":"GitHub Copilot","breadcrumbs":[{"href":"/ru/copilot","title":"GitHub Copilot"},{"href":"/ru/copilot/tutorials","title":"Учебники"},{"href":"/ru/copilot/tutorials/migrate-a-project","title":"Перенос проекта"}],"documentType":"article"},"body":"# Использование GitHub Copilot для миграции project на другой язык программирования\n\nGitHub Copilot Chat может помочь переместить проект на другой язык. В этом руководстве описывается, что связано с процессом миграции и приведен пример миграции PHP в Python.\n\n## Введение\n\nМиграция project на новый язык программирования может быть сложной и трудоёмкой задачей.\nGitHub Copilot вы можете помочь в этом процессе, объяснив изменения, которые необходимо внести и предложить код замены на новом языке.\n\n## Принципы миграции project на новый язык\n\nПрежде чем начать процесс миграции, рассмотрите следующие моменты:\n\n* **Знания по написанию кода**\n\n  Убедитесь, что у вас есть хорошее представление о обоих языках программирования. Хотя Copilot вы можете перевести код, вам нужно понять варианты, которые он предлагает, и решить, хотите ли вы использовать свои предложения или попросите альтернативное предложение.\n\n* **Знание системы, перенесенной**\n\n  Убедитесь, что вы понимаете архитектуру и логику текущей системы, помимо функциональных возможностей и функций, предоставляемых пользователям. Необходимо убедиться, что переведенный код выполняет все те же операции, что и исходный код, и создает одинаковые результаты.\n\n* **Использование ИИ для помощи вам**\n\n  Если вы не понимаете определенную часть кода, который вы хотите перевести, используйте Copilotфункцию \"объяснить\" либо в целом файле, либо выбранную часть кода в файле. См. [Задавать вопросы GitHub Copilot в вашем IDE](/ru/copilot/how-tos/chat-with-copilot/chat-in-ide).\n\n* **Расписание завершения миграции**\n\n  Преобразование — это многоэтапный процесс. Чем больше project вы конвертируете, тем больше вам предстоит выполнить шаги. Убедитесь, что вы разрешаете много времени для завершения всего процесса.\n\n* **Работа итеративно**\n\n  Старайтесь конвертировать отдельные части вашего project отдельно. Убедитесь, что вы проверили все внесенные изменения, прежде чем перейти к другой части project. Пишите тесты для отдельных частей project по ходу работы, чтобы убедиться, что каждый из новых компонентов работает как следует.\n\n* **Избегайте внедрения сложности процесса**\n\n  Сначала стоит to do аналогичной конвертации. Это невозможно для всего кода в вашем project. Однако, чтобы избежать добавления сложности в задачу миграции, следует попытаться ограничить количество новых изменений, которые вы вводите, кроме преобразования кода и использования новой платформы и соответствующих зависимостей.\n\n* **Тест и рефакторинг преобразованного кода**\n\n  Завершив начальное преобразование, и у вас есть рабочая система, вы можете выполнить тестирование для сравнения старых и новых систем. Теперь можно рефакторинг кода на новом языке. Это возможность оптимизировать код и сократить технический долг.\n\n## Использование Copilot для переноса проекта на новый язык\n\nЕсли вы уже ознакомились с существующим проектом, хороший способ начать миграцию — открыть ветвь репозитория в редакторе и обратиться Copilot за помощью.\n\n1. Откройте панель в редакторе Copilot Chat . См. [Задавать вопросы GitHub Copilot в вашем IDE](/ru/copilot/how-tos/chat-with-copilot/chat-in-ide).\n\n2. Попросите Copilot указать шаги, которые необходимо выполнить для переноса проекта на новый язык.\n\n   Например, для миграции с PHP на Python можно попросить:\n\n   ```copilot copy\n   @workspace I want to migrate this project from PHP to Python. Give me a high-level overview of the steps I need to take. Don't go into detail at this stage.\n   ```\n\n   > \\[!NOTE]\n   > Участник `@workspace` чата задает файлы в текущей рабочей области в качестве контекста для интересующего вас вопроса.\n\nCopilot Обычно возвращается список шагов, которые необходимо выполнить для переноса проекта.\n\n1. Скопируйте Copilotответ и сохраните его где-то, чтобы ссылаться на весь процесс.\n\n2. Проработайте каждый шаг процесса, запрашивая подробную справку по Copilot мере необходимости.\n\n   Внимательно рассмотрим каждое предложение Copilot . Убедитесь, что вы понимаете код, который он предлагает, и оцените, подходит ли он вашему project. Если вы не уверены, попросите Copilot объяснить вам код.\n\n   Если вы считаете, что изменение, предлагаемое Copilot не так ли, каким-то образом, попросите альтернативное предложение.\n\n3. Как только вы перенесли компонент в состояние, которое можно запустить, убедитесь, что он работает должным образом. Если она создает ошибку, скопируйте ошибку в Copilot Chat представление и попросите Copilot ее исправить.\n\n4. После завершения первоначального преобразования используйте Copilot для рефакторинга кода на новом языке. Для получения дополнительной информации см. [Рефакторинг кода с помощью GitHub Copilot](/ru/copilot/tutorials/refactor-code).\n\n## Пример: миграция PHP-project на Python\n\nВ следующем примере описывается миграция простого веб-приложения из PHP в Python. Даже если это не те языки программирования, которые вы используете для миграции, возможно, будет полезно следовать описанным здесь шагам, чтобы ознакомиться с миграцией project. Шаги будут аналогичны для переноса других небольших проектов с одного языка на другой.\n\n![Снимок экрана: \"Простой веб-сайт PHP\" перед миграцией с PHP на Python.](/assets/images/help/copilot/migration-original-website.png)\n\nВ коде из этого примера предполагается следующее:\n\n* Вы работаете Visual Studio Codeв .\n* Установлены оба языка: PHP и Python версии 3.12 или более поздней.\n\n### Миграция простого сайта project\n\nМы будем переносить код в этом общедоступном репозитории на GitHub: [docs/simple-php-site](https://github.com/docs/simple-php-website).\n\nРепозиторий состоит из следующих файлов.\n\n```text\n.gitignore\n.htaccess\nLICENSE\ncontent\n├── 404.phtml\n├── about-us.phtml\n├── contact.phtml\n├── home.phtml\n└── products.phtml\nincludes\n├── config.php\n└── functions.php\nindex.php\nreadme.md\ntemplate\n├── style.css\n└── template.php\n```\n\nВ этом примере приведены запросы, которые можно ввести Copilot Chat для завершения миграции, и ответы, возвращенные Copilot для одного экземпляра этой миграции. Модель GPT-4.1 использовалась для создания этих ответов.\nCopilot Chat ответы являются недетерминированными, поэтому вы, вероятно, получите немного разные ответы на те, которые показаны здесь.\n\nВо время процесса миграции, скорее всего, возникают ошибки, которые необходимо исправить перед переходом вперед.\nCopilot это поможет вам. В этом примере содержатся некоторые ошибки и показано, как можно Copilot устранить их.\n\nТак как ответы, от Copilot Chat которых вы получите, скорее всего, отличаются от приведенных здесь, могут возникнуть различные ошибки. Таким образом, вы можете легко выполнить этот пример миграции, используя ответы, показанные здесь, а не те, которые вы получаете от Copilot себя.\n\nПосле завершения этой миграции вы сможете использовать ту же методологию на своём project.\n\n1. Начните с клонирования копии репозитория на локальный компьютер.\n\n2. Запустите приложение, чтобы проверить его работу.\n\n   To do этого в терминале перейдите к корню клонированного репозитория и выполните следующую команду:\n\n   ```shell copy\n    php -S localhost:8000\n   ```\n\n   Затем в браузере перейдите к: <http://localhost:8000>\n\n3. Щелкните по веб-сайту, чтобы узнать его, чтобы убедиться, что миграция выполнена успешно.\n\n4. Создайте рабочую ветвь в репозитории и откройте ее в качестве новой рабочей области.Visual Studio Code\n\n5. Ознакомьтесь с содержанием и архитектурой существующего project.\n   Copilot Это поможет вам:\n\n   1. Copilot Chat Откройте представление.\n   2. Введите запрос, например:\n\n      ```copilot copy\n      @workspace Describe this project in detail, explaining what the various components do and how they interact.\n      ```\n\n6. Попросите Copilot общий обзор процесса миграции:\n\n   ```copilot copy\n   @workspace I want to migrate this project from PHP to Python. Give me a high-level overview of the steps I need to take. Don't go into detail at this stage.\n   ```\n\nCopilot ответит на такие инструкции, как:\n\n```text\nTo migrate this project from PHP to Python, follow these high-level steps:\n\n1. Set Up Python Environment:\n   - Install Python and set up a virtual environment.\n   - Install necessary packages (e.g., Flask for web framework).\n\n2. Convert Configuration:\n   - Translate the configuration settings from config.php to a Python configuration file.\n\n3. Rewrite Functions:\n   - Convert PHP functions in functions.php to Python functions.\n\n4. Create Flask Application:\n   - Set up a Flask application to handle routing and views.\n   - Map the routes to corresponding views.\n\n5. Convert Templates:\n   - Translate template.php to a Jinja2 template.\n   - Update the CSS file path in the template.\n\n6. Convert Content Pages:\n   - Convert .phtml content files to HTML or Jinja2 templates.\n\n7. Update .htaccess Rules:\n   - Translate .htaccess rewrite rules to Flask route handling.\n\n8. Run and Test:\n   - Run the Flask application and test all routes and functionalities.\n   - Ensure the site works as expected and fix any issues.\n\n9. Documentation:\n   - Update the readme.md with new instructions for running the Python project.\n```\n\n1. Скопируйте Copilotответ и сохраните его где-то, чтобы ссылаться на оставшуюся часть этого процесса. Вы будете работать с каждым из этих шагов, запрашивая Copilot справку по мере продолжения.\n\n2. Если вы еще не решили, какую Python платформу вы хотите использовать, вы можете обратиться Copilot за советом:\n\n   ```copilot copy\n   @workspace What Python frameworks can I use for this project once it is migrated to Python? Give me a selection of options, with a brief summary of the pros and cons of each in relation to this website project. Which framework would you recommend?\n   ```\n\nCopilot ответы с информацией о различных платформах и завершают следующее:\n\n```text\nFor a project like yours - which is a simple, content-driven website - Flask is highly recommended. Its simplicity, flexibility, and ease of use (especially with its templating system that can easily replace your current PHP template structure) make it a great fit.\n```\n\nМы будем принимать Copilotсоветы и использовать Flask.\n\n1. Возвращаясь к Copilotвысокому уровню обзора, первым шагом является настройка среды Python и установка необходимых пакетов. Чтобы узнать, как это сделать, введите Copilot Chat:\n\n   ```copilot copy\n   @workspace I want to use Flask. Tell me how to set up a virtual environment and install the necessary packages.\n   ```\n\nCopilot ответит на такие инструкции, как:\n\n```text\n1. Create a virtual environment:\n   - Open a terminal and navigate to your project directory.\n   - Run the following command to create a virtual environment:\n     python3 -m venv venv\n\n2. Activate the virtual environment:\n   - On macOS and Linux:\n     source venv/bin/activate\n\n   - On Windows:\n     venv\\Scripts\\activate\n\n3. Install Flask and necessary packages:\n   - With the virtual environment activated, run the following command\n     to install Flask and other necessary packages:\n     pip install Flask\n\n4. Verify the installation:\n   - You can verify that Flask is installed by running:\n     pip list\n```\n\n1. Следуйте Copilotинструкциям и используйте `pip list` для проверки установки Flask.\n\n2. Возвращаясь к Copilotобзору процесса миграции, следующим шагом является преобразование конфигурации. Обратитесь Copilot за помощью к этому. Например:\n\n   ```copilot copy\n   @workspace As the first step in migrating this project from PHP to Python, create a Python configuration file by converting the functions in functions.php to Python functions. Tell me where to locate the Python config file in the project.\n   ```\n\nCopilot предполагает создание файла, вызываемого `config.py` в каталоге `includes` , содержащего следующий код.\n\n```python copy\nconfig = {\n   'name': 'Simple Python Website',\n   'site_url': '',\n   'pretty_uri': False,\n   'nav_menu': {\n      '': 'Home',\n      'about-us': 'About Us',\n      'products': 'Products',\n      'contact': 'Contact',\n   },\n  'template_path': 'template',\n  'content_path': 'content',\n  'version': 'v3.1',\n}\n\ndef get_config(key=''):\n   return config.get(key, None)\n\ndef site_name():\n   return get_config('name')\n\ndef site_url():\n   return get_config('site_url')\n\ndef site_version():\n   return get_config('version')\n\ndef nav_menu(sep=' | '):\n   nav_menu = ''\n   nav_items = get_config('nav_menu')\n\n   for uri, name in nav_items.items():\n      query_string = request.args.get('page', '')\n      class_active = ' active' if query_string == uri else ''\n      url = f\"{get_config('site_url')}/{'' if get_config('pretty_uri') or uri == '' else '?page='}{uri}\"\n\n      nav_menu += f'<a href=\"{url}\" title=\"{name}\" class=\"item{class_active}\">{name}</a>{sep}'\n\n   return nav_menu.strip(sep)\n\ndef page_title():\n   page = request.args.get('page', 'Home')\n   return ' '.join(word.capitalize() for word in page.split('-'))\n\ndef page_content():\n   page = request.args.get('page', 'home')\n   path = os.path.join(os.getcwd(), get_config('content_path'), f'{page}.phtml')\n\n   if not os.path.exists(path):\n      path = os.path.join(os.getcwd(), get_config('content_path'), '404.phtml')\n\n   with open(path, 'r') as file:\n      return file.read()\n\ndef init():\n   template_path = os.path.join(get_config('template_path'), 'template.html')\n   with open(template_path, 'r') as file:\n      return file.read()\n```\n\n1. `includes/config.py` Создайте файл и удалите существующий `includes/config.php` файл.\n\n2. Вернитесь к обзору еще раз, попросите Copilot перезаписать функции PHP.\n\n   ```copilot copy\n   @workspace Continuing the migration of this project from PHP to Python, create Python functions to replace the existing PHP functions. Tell me where to locate the Python functions in the project.\n   ```\n\nCopilot предполагает создание файла, вызываемого `functions.py` в каталоге `includes` , содержащего следующий код.\n\n```python copy\nimport os\nfrom flask import request\nfrom .config import get_config\n\ndef site_name():\n   return get_config('name')\n\ndef site_url():\n   return get_config('site_url')\n\ndef site_version():\n   return get_config('version')\n\ndef nav_menu(sep=' | '):\n   nav_menu = ''\n   nav_items = get_config('nav_menu')\n\n   for uri, name in nav_items.items():\n      query_string = request.args.get('page', '')\n      class_active = ' active' if query_string == uri else ''\n      url = f\"{get_config('site_url')}/{'' if get_config('pretty_uri') or uri == '' else '?page='}{uri}\"\n\n      nav_menu += f'<a href=\"{url}\" title=\"{name}\" class=\"item{class_active}\">{name}</a>{sep}'\n\n   return nav_menu.strip(sep)\n\ndef page_title():\n   page = request.args.get('page', 'Home')\n   return ' '.join(word.capitalize() for word in page.split('-'))\n\ndef page_content():\n   page = request.args.get('page', 'home')\n   path = os.path.join(os.getcwd(), get_config('content_path'), f'{page}.phtml')\n\n   if not os.path.exists(path):\n      path = os.path.join(os.getcwd(), get_config('content_path'), '404.phtml')\n\n   with open(path, 'r') as file:\n      return file.read()\n\ndef init():\n   template_path = os.path.join(get_config('template_path'), 'template.html')\n   with open(template_path, 'r') as file:\n      return file.read()\n```\n\n1. `includes/functions.py` Создайте файл и удалите существующий `includes/functions.php` файл.\n\n2. Продолжая обзор, следующим шагом является создание приложения Flask. Попросите Copilot вас помочь в этом:\n\n   ```copilot copy\n   @workspace Set up a Flask application to handle routing and views, and map the routes to corresponding views. Tell me the location of any files that need to be created or changed.\n   ```\n\nCopilot предполагает создание файла, вызываемого `app.py` в корне проекта, содержащего следующий код.\n\n```python copy\nfrom flask import Flask, render_template, request\nimport os\n\napp = Flask(__name__)\n\nconfig = {\n   'name': 'Simple Python Website',\n   'site_url': '',\n   'pretty_uri': False,\n   'nav_menu': {\n      '': 'Home',\n      'about-us': 'About Us',\n      'products': 'Products',\n      'contact': 'Contact',\n   },\n   'template_path': 'template',\n   'content_path': 'content',\n   'version': 'v3.1',\n}\n\ndef get_config(key=''):\n   return config.get(key, None)\n\n@app.route('/')\n@app.route('/<page>')\ndef index(page='home'):\n   page_content = get_page_content(page)\n   page_title = get_page_title(page)\n   nav_menu = get_nav_menu()\n   return render_template('template.html', page_title=page_title, page_content=page_content, nav_menu=nav_menu)\n\ndef get_page_title(page):\n   return ' '.join(word.capitalize() for word in page.split('-'))\n\ndef get_page_content(page):\n   path = os.path.join(os.getcwd(), get_config('content_path'), f'{page}.phtml')\n   if not os.path.exists(path):\n      path = os.path.join(os.getcwd(), get_config('content_path'), '404.phtml')\n   with open(path, 'r') as file:\n      return file.read()\n\ndef get_nav_menu(sep=' | '):\n   nav_menu = ''\n   nav_items = get_config('nav_menu')\n   for uri, name in nav_items.items():\n      query_string = request.args.get('page', '')\n      class_active = ' active' if query_string == uri else ''\n      url = f\"{get_config('site_url')}/{'' if get_config('pretty_uri') or uri == '' else '?page='}{uri}\"\n      nav_menu += f'<a href=\"{url}\" title=\"{name}\" class=\"item{class_active}\">{name}</a>{sep}'\n   return nav_menu.strip(sep)\n\nif __name__ == '__main__':\n   app.run(debug=True)\n```\n\nCopilot также предлагает переименовать `template/template.php``template/template.html` и обновить файл для использования синтаксиса шаблонов Jinja2:\n\n```html copy\n\n<!DOCTYPE html>\n<html>\n<head>\n   <meta charset=\"utf-8\" />\n   <meta http-equiv=\"x-ua-compatible\" content=\"ie=edge\"/>\n   <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"/>\n   <title>{{ page_title }} | {{ get_config('name') }}</title>\n   <link href=\"{{ get_config('site_url') }}/template/style.css\" rel=\"stylesheet\" type=\"text/css\" />\n</head>\n<body>\n<div class=\"wrap\">\n\n   <header>\n      <h1>{{ get_config('name') }}</h1>\n      <nav class=\"menu\">\n         {{ nav_menu|safe }}\n      </nav>\n   </header>\n\n   <article>\n      <h2>{{ page_title }}</h2>\n      {{ page_content|safe }}\n   </article>\n\n   <footer>\n      <small>&copy;{{ get_config('version') }} {{ get_config('name') }}.<br>{{ get_config('version') }}</small>\n   </footer>\n\n</div>\n</body>\n</html>\n\n```\n\n1. `app.py` Создайте и `template/template.html` файлы, как показано ниже.\n\n2. Copilot также может предложить, что, создав эти файлы, теперь вы запускаете `python app.py` в терминале, из корневого каталога репозитория, а затем перейдите к <http://127.0.0.1:5000>.\n\n   > \\[!NOTE]\n   > В зависимости от того, как Python установлен на компьютере, может потребоваться использовать команду `python3 app.py` вместо `python app.py` того, чтобы убедиться, что используется правильная версия Python.\n\n   При этом в браузере будут отображаться сообщения об ошибках.\n\n3. Скопируйте исходное `TemplateNotFound` сообщение об ошибке Copilot Chat в представление и спросите, как это исправить. Например:\n\n   ```copilot copy\n   @workspace When I run `python3 app.py`, I get the following error in the browser: `jinja2.exceptions.TemplateNotFound: template.html`. How can I fix this?\n   ```\n\nCopilot Возвращает сообщение об ошибке, указывающее, что Flask не может найти `template.html` файл.\n\nОн показывает, что по умолчанию Flask ищет шаблоны в папке `templates` в корневой директории вашего project. Однако файл `template.html` находится в каталоге `template` . Чтобы устранить эту проблему, необходимо указать правильную папку шаблона при создании приложения Flask. Он советует обновить `app.py` файл, изменив назначение `app = Flask(__name__)` , чтобы включить `template_folder` параметр:\n\n```python copy\napp = Flask(__name__, template_folder='template')\n```\n\n1. Если сервер разработки Flask по-прежнему запущен, при обновлении страницы <http://127.0.0.1:5000/>браузера появится новая ошибка, связанная с `get_config` функцией.\n\n   Скопируйте это сообщение об ошибке в представление и попросите Copilot Chat справку.\n\n   ```copilot copy\n   @workspace When I run `python3 app.py`, I get the following error in the browser: `jinja2.exceptions.UndefinedError: 'get_config' is undefined.` How can I fix this?\n   ```\n\nCopilot возвращает сообщение об ошибке, так как `get_config` недоступно в контексте шаблона Jinja2. Он советует добавить следующий код в `app.py` файл непосредственно перед строкой `@app.route('/')`:\n\n```python copy\napp.jinja_env.globals.update(get_config=get_config)\n```\n\n1. Обновите браузер и теперь увидите веб-сайт.\n\n   ![Снимок экрана: \"Простой веб-сайт Python\" без стилей CSS.](/assets/images/help/copilot/migration-no-css-website.png)\n\n   Однако ни один из стилей CSS не применяется. Далее мы исправим эту проблему.\n\n2. Спросите Copilot:\n\n   ```copilot copy\n   @workspace The deployed website does not use the CSS styles. How can I fix this?\n   ```\n\nCopilot сообщает, что Flask ожидает, что CSS-файл будет находиться в каталоге с именем `static`. Он предлагает переместить существующий `style.css` файл из `template` каталога в новый `static` каталог, а затем обновить путь к `style.css` файлу в `head` пределах части `template.html` файла. Измените следующее:\n\n```html copy\n\n<link rel=\"stylesheet\" href=\"{{ url_for('static', filename='style.css') }}\">\n\n```\n\nПри обновлении браузера веб-сайт должен правильно отображаться.\n\nЧтобы завершить начальную миграцию, продолжайте работать с инструкциями, описанными в кратком обзоре, который Copilot дал вам, запросив помощь по мере необходимости.\n\n### Завершение миграции\n\nДальнейшие действия по успешному выполнению процесса миграции будут включать:\n\n* **Тщательно проверьте** начальную миграцию.\n* **Исправление ошибок**. Например, в приведенном здесь примере ссылки на страницы работают только в том случае, если задано `pretty_uri``True` значение в `config` разделе `app.py` файла. Если вы хотите использовать параметры строки запроса в URL-адресах страницы или удалить этот параметр из кода, вы можете обратиться Copilot за помощью к этому.\n* **Writing tests** для мигрированных project.\n* **Очистка** project удаляя все файлы, которые больше не нужны.\n* **Рефакторинг** кода на новом языке. Процесс миграции привёл к созданию Python-проекта, архитектура которого основана на оригинальном PHP-project. Выполнив начальную миграцию, теперь можно рефакторинг кода, чтобы лучше всего использовать функции языка Python и платформы Flask.\n* **Обновление документации**. Теперь `readme.md` файл устарел и должен быть перезаписан."}