Skip to content

Commit

Permalink
Stamp React Native Version Into C++ Code (#28036)
Browse files Browse the repository at this point in the history
Summary:
The PlatformConstants native module exposes the ability to query the React
Native version used to build native code. This is managed on iOS and Android by
a version bumping script, which replaces module code based on a template.

It is currently difficult to accurately determine this version for out-of-tree C++
platforms (I.e. React Native Windows). The version of upstream react-native we resolve to is ultimately
dependent on the version of react-native chosen a peer dependency, which is not
neccesarily constant given a build of react-native-windows.

We could try to hack around this, and make our native build try to reason about
the resolved pacakge for react-native using a lockfile, but a much cleaner
solution is to embed version into C++ code, similar to what is done for Android
and iOS. This change does that, adding a header with React Native version and
updating the build stamping script to write to it.

Usage sample:

```c++
  constants["reactNativeVersion"] = folly::dynamic::object();
  constants["reactNativeVersion"]["major"] = ReactNativeVersion.Major;
  constants["reactNativeVersion"]["minor"] = ReactNativeVersion.Minor;
  constants["reactNativeVersion"]["patch"] = ReactNativeVersion.Patch;
```
## Changelog

[General] [Added] - Stamp React Native Version Into C++ Code
Pull Request resolved: #28036

Test Plan: Validated that the bumping script will accurately update the header, can compile under both MSVC and Clang.

Differential Revision: D19865992

Pulled By: hramos

fbshipit-source-id: 9e0b8e9519015bb62c60b9935a234cd367a1926a
  • Loading branch information
NickGerleman authored and facebook-github-bot committed Feb 27, 2020
1 parent d33ead3 commit 427ba35
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 0 deletions.
24 changes: 24 additions & 0 deletions ReactCommon/cxxreact/ReactNativeVersion.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @generated by scripts/bump-oss-version.js
*/

#pragma once

#include <cstdint>
#include <string_view>

namespace facebook::react {

constexpr struct {
int32_t Major = 0;
int32_t Minor = 0;
int32_t Patch = 0;
std::string_view Prerelease = "";
} ReactNativeVersion;

} // namespace facebook::react
13 changes: 13 additions & 0 deletions scripts/bump-oss-version.js
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,19 @@ fs.writeFileSync(
'utf-8',
);

fs.writeFileSync(
'ReactCommon/cxxreact/ReactNativeVersion.h',
cat('scripts/versiontemplates/ReactNativeVersion.h.template')
.replace('${major}', major)
.replace('${minor}', minor)
.replace('${patch}', patch)
.replace(
'${prerelease}',
prerelease !== undefined ? `"${prerelease}"` : '""',
),
'utf-8',
);

fs.writeFileSync(
'Libraries/Core/ReactNativeVersion.js',
cat('scripts/versiontemplates/ReactNativeVersion.js.template')
Expand Down
24 changes: 24 additions & 0 deletions scripts/versiontemplates/ReactNativeVersion.h.template
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @generated by scripts/bump-oss-version.js
*/

#pragma once

#include <cstdint>
#include <string_view>

namespace facebook::react {

constexpr struct {
int32_t Major = ${major};
int32_t Minor = ${minor};
int32_t Patch = ${patch};
std::string_view Prerelease = ${prerelease};
} ReactNativeVersion;

} // namespace facebook::react

0 comments on commit 427ba35

Please sign in to comment.