「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > ネイティブ開発者の反応を支援するスクリプト

ネイティブ開発者の反応を支援するスクリプト

2024 年 11 月 1 日に公開
ブラウズ:658

A Script To Help React Native Developers

やあ!

React Native を使用している場合は、エミュレータの問題に遭遇したことがあるでしょう。 React Native コマンドを実行しても、エミュレーターが検出されません。 .zshrc、.bash_profile、または同様のファイルに必要な環境変数をすべて設定した後でも、まだ機能しません。

一般的な問題と修正は次のとおりです:

  1. エミュレータが見つかりません: これは、Android SDK パスが正しく設定されていない場合に発生する可能性があります。 ANDROID_HOME および PATH 環境変数が正しいディレクトリを指していることを再確認してください。次の行を .zshrc または .bash_profile に追加できます:

    export ANDROID_HOME=$HOME/Library/Android/sdk
    export PATH=$PATH:$ANDROID_HOME/emulator
    export PATH=$PATH:$ANDROID_HOME/tools
    export PATH=$PATH:$ANDROID_HOME/tools/bin
    export PATH=$PATH:$ANDROID_HOME/platform-tools
    

    これらの変更を加えた後、ターミナルを再起動するか、source ~/.zshrc (またはsource ~/.bash_profile) を実行します。

  2. Watchman エラー: Facebook のファイル監視サービスである Watchman は、古いファイル キャッシュに関する問題を引き起こす場合があります。これを修正するには、
    を実行します。

    watchman watch-del-all
    

    次に、React Native サーバーを再起動します。

  3. adb reverse to Connect to localhost: アプリが Android エミュレータ内からローカルホストに接続できない場合は、次のコマンドを実行する必要がある場合があります:

    adb reverse tcp:8081 tcp:8081
    

    このコマンドは、エミュレータからローカル マシンにトラフィックをルーティングします。端末から adb にアクセスできることを確認してください。

  4. キャッシュをクリアして再ビルド: それでも問題が解決しない場合は、キャッシュをクリアしてプロジェクトを再ビルドしてみてください:

    npm start -- --reset-cache
    cd android && ./gradlew clean
    cd ios && xcodebuild clean
    

    その後、React Native アプリを再度実行します。

  5. react-native run-android または run-ios を直接使用する: エミュレータが IDE またはターミナルから正しく起動しない場合は、次のようにしてアプリを直接実行してみてください:

    npx react-native run-android
    npx react-native run-ios
    

これらの問題のデバッグはイライラするかもしれませんが、これらの手順は多くの一般的な問題を解決するのに役立ちました。

使いやすいスクリプトも作成しました

const {spawn, exec} = require('child_process');
const path = require('path');

// Define paths
const projectPath = path.resolve();

// Define commands
const watchDelCommand = `watchman watch-del '${projectPath}'`;
const watchProjectCommand = `watchman watch-project '${projectPath}'`;

// Function to execute commands
const clearWatchman = () => {
  // Execute watch-del command
  exec(watchDelCommand, (error, stdout, stderr) => {
    if (error) {
      console.error(`Error executing watch-del command: ${error.message}`);
      return;
    }
    if (stderr) {
      console.error(`stderr: ${stderr}`);
      return;
    }
    console.log(`watch-del command executed successfully: ${stdout}`);

    // Execute watch-project command
    exec(watchProjectCommand, (error, stdout, stderr) => {
      if (error) {
        console.error(
          `Error executing watch-project command: ${error.message}`,
        );
        return;
      }
      if (stderr) {
        console.error(`stderr: ${stderr}`);
        return;
      }
      console.log(`watch-project command executed successfully: ${stdout}`);
    });
  });
};

async function reverseAdb() {
  console.log('Running... adb reverse tcp:8080 tcp:8080');
  // After the emulator has started  adb reverse tcp:8080 tcp:8080
  const adbReverse = spawn('adb', ['reverse', 'tcp:8080', 'tcp:8080']);
  await new Promise((resolve, reject) => {
    let output = '';
    adbReverse.stdout.on('data', data => {
      output  = data.toString();
    });
    adbReverse.on('close', () => {
      resolve();
    });
    adbReverse.stderr.on('error', reject);
  }).catch(error => console.error('Error  reversing ADB port to 8080:', error));
}

async function runEmulator() {
  try {
    clearWatchman();
    // Check for running emulator
    const adbDevices = spawn('adb', ['devices']);
    const devices = await new Promise((resolve, reject) => {
      let output = '';
      adbDevices.stdout.on('data', data => {
        output  = data.toString();
      });
      adbDevices.on('close', () => {
        resolve(output.includes('emulator'));
      });
      adbDevices.stderr.on('error', reject);
    });

    if (devices) {
      console.log('Emulator is already running');
      reverseAdb();
      return;
    }

    // Get list of available emulators
    const emulatorList = spawn('emulator', ['-list-avds']);
    const emulatorName = await new Promise((resolve, reject) => {
      let output = '';
      emulatorList.stdout.on('data', data => {
        output  = data.toString();
      });
      emulatorList.on('close', () => {
        const lines = output.split('\n').filter(Boolean); // Filter out empty lines
        if (lines.length === 0) {
          reject(new Error('No AVDs found'));
        } else {
          resolve(lines[lines.length - 1]); // Get the last non-empty line
        }
      });
      emulatorList.stderr.on('error', reject);
    });

    // Start the emulator in detached mode
    const emulatorProcess = spawn('emulator', ['-avd', emulatorName], {
      detached: true,
      stdio: 'ignore',
    });

    emulatorProcess.unref(); // Allow the parent process to exit independently of the child

    reverseAdb();

    console.log(`Starting emulator: ${emulatorName}`);
  } catch (error) {
    console.error('Error running emulator:', error);
  }
}

runEmulator();


// package.json

  "scripts": {
    ...

    "dev:android": "yarn android:emulator && npx react-native@latest start",
    "android:emulator": "node runEmulator.js",

    ...
  },

上記のスクリプトを使用すると、エミュレータと React Native を同時に実行できます。

読んでいただきありがとうございます!

リリースステートメント この記事は次の場所に転載されています: https://dev.to/frulow/a-script-to-help-react-native-developers-fk7?1 侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3