如何使用expo配置插件在本机文件夹中创建新文件?

问题描述 投票:0回答:1

如标题所示。使用 expo 配置插件,我已经弄清楚如何对清单、主要活动等进行更改。

现在我需要在 android 文件夹中创建一些新的活动文件(我不确定这是否可能)或者有某种方法可以解决

android 文件夹中的结构应如下所示

android
|-- app
|   |-- src
|   |   |-- main
|   |   |   |-- java/com/my/app
|   |   |   |    |-- [folder I want to create]
|   |   |   |    |   |-- [new activity files shall goes here]
|   |   |   |    |-- MainActivity.java
|   |   |   |    |-- MainApplication.java

当然,我可以应用简单的工作流程并直接在本机文件夹内更改文件。但是我想继续使用托管工作流程。所以如果有什么办法我可以存档这个,那就太好了!

react-native expo
1个回答
0
投票

具体示例可以参见[https://github.com/wodin/rn-hce-test/blob/395c1870acb9b9fbaec8349132af92d910a4d17d/plugins/withReactNativeHce.js#L110-L116]

dangerous mod
为我们提供创建文件夹或文件的工具。

示例:

import { withDangerousMod } from '@expo/config-plugins'

const wxapiAndroid: ConfigPlugin = (config) => {
  return withDangerousMod(config, [
    'android',
    async (config) => {
      const customePackageName = 'com.johome.pro'
      const srcPath = path.resolve(config.modRequest.projectRoot, config.modRequest.platformProjectRoot, `app/src/main/java/com/johome/pro`)
      //create a new file
      const newFileName = 'WXEntryActivity.java'
      const newFolderName = 'wxapi'
      const newFileContent = `
package ${customePackageName}.wxapi;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
public class WXEntryActivity extends Activity {
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    try {
      Intent intent = getIntent();
      Intent intentToBroadcast = new Intent();
      intentToBroadcast.setAction("com.hector.nativewechat.ACTION_REDIRECT_INTENT");
      intentToBroadcast.putExtra("intent", intent);
      sendBroadcast(intentToBroadcast);
      finish();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}
`
      const newFilePath = path.resolve(srcPath, newFolderName, newFileName)

      //create a new folder
      const newFolderPath = path.resolve(srcPath, newFolderName)
      if (!fs.existsSync(newFolderPath)) {
        fs.mkdirSync(newFolderPath)
      }

      //create a new file
      if (!fs.existsSync(newFilePath)) {
        fs.writeFileSync(newFilePath, newFileContent)
      }

      //create the pay api file
      const payApiFileName = 'WXPayEntryActivity.java'
      const payApiFileContent = `
        package ${customePackageName}.wxapi;
        import android.app.Activity;
        import android.os.Bundle;
        public class WXPayEntryActivity extends Activity {
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                
                finish();
            }
        }
        `

      const payApiFilePath = path.resolve(srcPath, newFolderName, payApiFileName)
      if (!fs.existsSync(payApiFilePath)) {
        fs.writeFileSync(payApiFilePath, payApiFileContent)
      }

      return config
    },
  ])
}

export default wxapiAndroid


© www.soinside.com 2019 - 2024. All rights reserved.