mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
Fix use_react_native to support absolute paths (#37545)
Summary: While setting up a monorepo that required a custom react-native path location (react-native-macos in my case) I was getting the following error when running `pod install`  That's because `build_codegen` and `checkAndGenerateEmptyThirdPartyProvider` functions don't check if the given `react_native_path` is absolute or relative. This PR fixes this problem by checking if `react_native_path` starts with `/` bypass-github-export-checks ## Changelog: [IOS] [FIXED] - Fix `use_react_native` to support custom react native absolute paths Pull Request resolved: https://github.com/facebook/react-native/pull/37545 Test Plan: Modify [rn-tester/Podfile](https://github.com/facebook/react-native/tree/main/packages/rn-tester/Podfile) to use an absolute path when calling `use_react_native` E.g. ```rb rn_path = File.dirname(`node --print "require.resolve('react-native/package.json')"`) use_react_native!( path: rn_path, ... ) ``` then run `pod install` Reviewed By: cortinico Differential Revision: D46279570 Pulled By: cipolleschi fbshipit-source-id: 0d6da12c5617cfca2c9ef9dea08ecf728a970b6f
This commit is contained in:
committed by
Facebook GitHub Bot
parent
ed929dfd01
commit
835f62c189
@@ -182,6 +182,47 @@ class CodegenTests < Test::Unit::TestCase
|
||||
})
|
||||
end
|
||||
|
||||
def testCheckAndGenerateEmptyThirdPartyProvider_withAbsoluteReactNativePath_buildCodegen()
|
||||
# Arrange
|
||||
rn_path = '/Users/distiller/react-native/packages/react-native'
|
||||
codegen_cli_path = rn_path + "/../@react-native/codegen"
|
||||
DirMock.mocked_existing_dirs([
|
||||
codegen_cli_path,
|
||||
])
|
||||
|
||||
# Act
|
||||
checkAndGenerateEmptyThirdPartyProvider!(rn_path, false, dir_manager: DirMock, file_manager: FileMock)
|
||||
|
||||
# Assert
|
||||
assert_equal(Pathname.pwd_invocation_count, 1)
|
||||
assert_equal(Pod::Config.instance.installation_root.relative_path_from_invocation_count, 1)
|
||||
assert_equal(FileMock.exist_invocation_params, [
|
||||
rn_path + "/React/Fabric/" + @third_party_provider_header,
|
||||
rn_path + "/React/Fabric/" + @tmp_schema_list_file
|
||||
])
|
||||
assert_equal(DirMock.exist_invocation_params, [
|
||||
rn_path + "/../react-native-codegen",
|
||||
codegen_cli_path,
|
||||
codegen_cli_path + "/lib",
|
||||
])
|
||||
assert_equal(Pod::UI.collected_messages, [
|
||||
"[Codegen] building #{codegen_cli_path}.",
|
||||
"[Codegen] generating an empty RCTThirdPartyFabricComponentsProvider"
|
||||
])
|
||||
assert_equal($collected_commands, [rn_path + "/../@react-native/codegen/scripts/oss/build.sh"])
|
||||
assert_equal(FileMock.open_files[0].collected_write, ["[]"])
|
||||
assert_equal(FileMock.open_files[0].fsync_invocation_count, 1)
|
||||
assert_equal(Pod::Executable.executed_commands[0], {
|
||||
"command" => "node",
|
||||
"arguments" => [
|
||||
rn_path + "/scripts/generate-provider-cli.js",
|
||||
"--platform", 'ios',
|
||||
"--schemaListPath", rn_path + "/React/Fabric/" + @tmp_schema_list_file,
|
||||
"--outputDir", rn_path + "/React/Fabric"
|
||||
]
|
||||
})
|
||||
end
|
||||
|
||||
# ================= #
|
||||
# Test - RunCodegen #
|
||||
# ================= #
|
||||
|
||||
@@ -11,8 +11,8 @@
|
||||
# - dir_manager: a class that implements the `Dir` interface. Defaults to `Dir`, the Dependency can be injected for testing purposes.
|
||||
# @throws an error if it could not find the codegen folder.
|
||||
def build_codegen!(react_native_path, relative_installation_root, dir_manager: Dir)
|
||||
codegen_repo_path = "#{relative_installation_root}/#{react_native_path}/../react-native-codegen";
|
||||
codegen_npm_path = "#{relative_installation_root}/#{react_native_path}/../@react-native/codegen";
|
||||
codegen_repo_path = "#{basePath(react_native_path, relative_installation_root)}/../react-native-codegen";
|
||||
codegen_npm_path = "#{basePath(react_native_path, relative_installation_root)}/../@react-native/codegen";
|
||||
codegen_cli_path = ""
|
||||
|
||||
if dir_manager.exist?(codegen_repo_path)
|
||||
@@ -61,7 +61,7 @@ def checkAndGenerateEmptyThirdPartyProvider!(react_native_path, new_arch_enabled
|
||||
Pod::Executable.execute_command(
|
||||
'node',
|
||||
[
|
||||
"#{relative_installation_root}/#{react_native_path}/scripts/generate-provider-cli.js",
|
||||
"#{basePath(react_native_path, relative_installation_root)}/scripts/generate-provider-cli.js",
|
||||
"--platform", 'ios',
|
||||
"--schemaListPath", temp_schema_list_path,
|
||||
"--outputDir", "#{output_dir}"
|
||||
@@ -108,3 +108,12 @@ def run_codegen!(
|
||||
codegen_utils.generate_react_codegen_podspec!(react_codegen_spec, codegen_output_dir)
|
||||
end
|
||||
end
|
||||
|
||||
def basePath(react_native_path, relative_installation_root)
|
||||
expanded_path = File.expand_path(react_native_path)
|
||||
if expanded_path == react_native_path
|
||||
react_native_path
|
||||
else
|
||||
File.join(relative_installation_root.to_s, react_native_path)
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user