Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 31 additions & 4 deletions dist/plugins/withViroAndroid.js
Original file line number Diff line number Diff line change
Expand Up @@ -134,13 +134,40 @@ const withViroAppBuildGradle = (config) => (0, config_plugins_1.withAppBuildGrad
config.modResults.contents = config.modResults.contents.replace(/implementation\("com.facebook.react:react-android"\)/, `implementation("com.facebook.react:react-android")${viroNewArchDependencies}`);
return config;
});
/**
* Resolve the on-disk `@reactvision/react-viro/android` directory as a path
* relative to the Android project root (where `settings.gradle` lives).
*
* Hardcoding `../node_modules/...` assumes react-viro is installed in the app's
* own `node_modules`. That is false under pnpm/yarn workspaces (and npm
* workspaces), where the package is hoisted to the monorepo root or nested
* under `.pnpm`, so Gradle fails with "Configuring project ':gvr_common'
* without an existing directory is not allowed". Resolving via Node follows
* symlinks/hoisting and works in both flat and workspace layouts.
*/
function resolveViroAndroidRelativePath(projectRoot, androidRoot) {
const fallback = "../node_modules/@reactvision/react-viro/android";
try {
const pkgJson = require.resolve("@reactvision/react-viro/package.json", {
paths: [projectRoot],
});
const viroAndroidDir = path_1.default.join(path_1.default.dirname(pkgJson), "android");
// Gradle resolves relative File(...) against the settings.gradle dir (androidRoot).
// Always emit POSIX separators — Gradle accepts them on every platform.
return path_1.default.relative(androidRoot, viroAndroidDir).split(path_1.default.sep).join("/");
}
catch {
return fallback;
}
}
const withViroSettingsGradle = (config) => (0, config_plugins_1.withSettingsGradle)(config, async (config) => {
const viroAndroid = resolveViroAndroidRelativePath(config.modRequest.projectRoot, config.modRequest.platformProjectRoot);
config.modResults.contents += `
include ':react_viro', ':arcore_client', ':gvr_common', ':viro_renderer'
project(':arcore_client').projectDir = new File('../node_modules/@reactvision/react-viro/android/arcore_client')
project(':gvr_common').projectDir = new File('../node_modules/@reactvision/react-viro/android/gvr_common')
project(':viro_renderer').projectDir = new File('../node_modules/@reactvision/react-viro/android/viro_renderer')
project(':react_viro').projectDir = new File('../node_modules/@reactvision/react-viro/android/react_viro')
project(':arcore_client').projectDir = new File('${viroAndroid}/arcore_client')
project(':gvr_common').projectDir = new File('${viroAndroid}/gvr_common')
project(':viro_renderer').projectDir = new File('${viroAndroid}/viro_renderer')
project(':react_viro').projectDir = new File('${viroAndroid}/react_viro')
`;
return config;
});
Expand Down
38 changes: 34 additions & 4 deletions plugins/withViroAndroid.ts
Original file line number Diff line number Diff line change
Expand Up @@ -211,14 +211,44 @@ const withViroAppBuildGradle = (config: ExpoConfig) =>
return config;
});

/**
* Resolve the on-disk `@reactvision/react-viro/android` directory as a path
* relative to the Android project root (where `settings.gradle` lives).
*
* Hardcoding `../node_modules/...` assumes react-viro is installed in the app's
* own `node_modules`. That is false under pnpm/yarn workspaces (and npm
* workspaces), where the package is hoisted to the monorepo root or nested
* under `.pnpm`, so Gradle fails with "Configuring project ':gvr_common'
* without an existing directory is not allowed". Resolving via Node follows
* symlinks/hoisting and works in both flat and workspace layouts.
*/
function resolveViroAndroidRelativePath(projectRoot: string, androidRoot: string): string {
const fallback = "../node_modules/@reactvision/react-viro/android";
try {
const pkgJson = require.resolve("@reactvision/react-viro/package.json", {
paths: [projectRoot],
});
const viroAndroidDir = path.join(path.dirname(pkgJson), "android");
// Gradle resolves relative File(...) against the settings.gradle dir (androidRoot).
// Always emit POSIX separators — Gradle accepts them on every platform.
return path.relative(androidRoot, viroAndroidDir).split(path.sep).join("/");
} catch {
return fallback;
}
}

const withViroSettingsGradle = (config: ExpoConfig) =>
withSettingsGradle(config, async (config) => {
const viroAndroid = resolveViroAndroidRelativePath(
config.modRequest.projectRoot,
config.modRequest.platformProjectRoot
);
config.modResults.contents += `
include ':react_viro', ':arcore_client', ':gvr_common', ':viro_renderer'
project(':arcore_client').projectDir = new File('../node_modules/@reactvision/react-viro/android/arcore_client')
project(':gvr_common').projectDir = new File('../node_modules/@reactvision/react-viro/android/gvr_common')
project(':viro_renderer').projectDir = new File('../node_modules/@reactvision/react-viro/android/viro_renderer')
project(':react_viro').projectDir = new File('../node_modules/@reactvision/react-viro/android/react_viro')
project(':arcore_client').projectDir = new File('${viroAndroid}/arcore_client')
project(':gvr_common').projectDir = new File('${viroAndroid}/gvr_common')
project(':viro_renderer').projectDir = new File('${viroAndroid}/viro_renderer')
project(':react_viro').projectDir = new File('${viroAndroid}/react_viro')
`;
return config;
});
Expand Down
Loading