Я нашел проблему на Firebase Cli Repo что я мог работать дальше. Выпуск Вовлечена Hardcoded Node.js версия в сгенерированном package.json
файл, когда команда Функции init firebase
выполняется. Более того, не было предупреждения, когда в использовании Node.js используется версия Node.js устарена в функциях облачных Google.
Начиная
Если честно, я понятия не имел, как сначала подойдет к этому вопросу, поэтому я решил следовать послужению гида. Это было очень подробно и просто, поэтому у меня не было проблем с настройками Firebase-Tools
Отказ В отличие от предыдущих проектов с открытым исходным кодом, я должен был подписать Google Участник лицензионного соглашения (CLA), прежде чем я смогу внести свой вклад в Firebase CLI. Благодаря интуитивно понятной структуре папки проекта я могу определить, какие файлы будут изменены.
Динамически установлена версия узла
На основании структуры папки Функции init firebase
должен выполнить код внутри Firebase-Tools/SRC/INIT/Особенности/Функции/<Язык> .js
( <Язык>
– это язык программирования, выбранный для вашего проекта). Я сделал Комментарий по вопросу, чтобы обсудить мой подход. К счастью, у меня есть несколько супер полезных рекомендаций Даниэль , автор вопроса.
В основном, package.json
Файл генерируется из предварительно написанного шаблона. Чтобы установить правильную версию Node.js, мне нужна логика, чтобы идентифицировать ее и заменить жесткозедированную версию динамически.
Во-первых, я заменил жесткодируемую версию с шаблонной строкой внутри package.json
Файл шаблона:
"engines": { "node": "{{NODE_VERSION}}" },
Затем была реализована надежная функция для обнаружения версии Node.js:
export function getNodeVersionString(): string { return process.versions.node.split(".")[0]; }
Наконец, прежде чем писать package.json
Файл на машину Dev, мне просто нужно заменить строку шаблона с обнаруженной версией Node.js, как это:
const nodeEngineVersion = getNodeVersionString(); if (useLint) { return PACKAGE_LINTING_TEMPLATE.replace(/{{NODE_VERSION}}/g, nodeEngineVersion); } return PACKAGE_NO_LINTING_TEMPLATE.replace(/{{NODE_VERSION}}/g, nodeEngineVersion);
- Package_linting_template : содержание
package.json
Файл с Eslint. - Package_no_linting_template : содержание
package.json
Файл без Eslint.
Обрабатывать устаренные версии узла
Логика для предупреждения разработчиков устаревших версий Node.js все еще пропала, поэтому я обсуждал Мой подход С Даниилом снова. Я намеревался использовать функцию, которую я нашел в их кодовой базе, isdeprecatedruntime ()
, чтобы выполнить чек.
К счастью, Даниэль уступил небольшой ошибку в моем подходе и предложил лучшего, который должен был использовать ISVALDRUNTIME ()
вместо. Я наконец получил последнюю часть как:
if (!isValidRuntime(`nodejs${nodeEngineVersion}`)) { utils.logWarning(`Node ${nodeEngineVersion} is no longer supported in Google Cloud Functions.`); utils.logWarning( "See https://firebase.google.com/docs/functions/manage-functions for more details" ); }
Последние мысли
Мне никогда не пришлось исправить свой код для PR так же, как этот. Благодаря своему обзору кода я узнал несколько хороших практик вместе с тем, как я могу избежать подводных камней, обсудив мой подход и получая обратную связь, прежде чем на самом деле кодировать его.
Выпуск: https://github.com/firebase/firebase-tools/issues/3407 PR: https://github.com/firebase/firebase-tools/pull/3894. Firebase: https://firebase.google.com.
Оригинал: “https://dev.to/oliverpham/how-i-fixed-an-issue-in-firebase-cli-4i41”