在firebase上,我们在同一个项目中注册了基本版和专业版两个应用程序。因此,现在我们有两个google-services.json文件。
现在的问题是 - 如何在不同的构建配置下处理不同的google-services.json文件。
已解决:Xamarin Firebase在不同编译设置中使用不同的google-services.json。
尝试@SushiHangover的解决方案后,进行构建时出现以下异常,类似于:
无法读取或反序列化GoogleServicesJson文件:google-services.json System.IO.FileNotFoundException: 找不到文件 [您的根目录]\google-services.json'。
位于
[您的包目录]\Xamarin.GooglePlayServices.Basement.60.1142.1\build\MonoAndroid80\Xamarin.GooglePlayServices.Basement.targets(66,5): error : Failed to Read or Deserialize GoogleServicesJson file: google-services.json。
1. 创建包含不同google-services.json文件的文件夹,位于[ProjectDir]。
例如:
[ProjectDir]/GoogleServices >
google-services-development.json google-services-production.json google-services-any.json
[ProjectDir]为您的项目目录路径。
2. 在您的[ProjectDir]级别上创建一个虚假的google-services.json。
3. 将其包含在您的项目中。
4. 进入属性 > 构建操作 > GoogleServicesJson。
5. 创建您的构建配置。这是您将用于在编译和执行项目之前更改配置并选择哪个GoogleServiceJson将与您的配置产生作用的内容。
进入生成> 配置管理器...> 活动解决方案配置 > 新建...
设置您的配置名称,然后单击确定。
6. 选择您刚刚创建的配置(进入生成> 配置管理器...> 活动解决方案配置并选择它,然后关闭),并在预编译事件中配置命令以从您的文件夹GoogleServices复制文件到[ProjectDir]中。
进入项目> [您的项目名称]属性... > 构建 > 预生成事件命令行 > 编辑预生成
7. 添加要复制指定文件的命令到您的配置中。
使用生产配置示例:
重复步骤5到7,为每个google-service.json创建一个构建配置。
Visual Studio for Windows 命令:
用于开发配置的示例命令:
COPY /Y "$(ProjectDir)GoogleServices\google-services-development.json" "$(ProjectDir)google-services.json"
用于生产配置的示例命令:
COPY /Y "$(ProjectDir)GoogleServices\google-services-production.json" "$(ProjectDir)google-services.json"
用于任何配置的示例命令:
COPY /Y "$(ProjectDir)GoogleServices\google-services-any.json" "$(ProjectDir)google-services.json"
Visual Studio for MAC 命令:
用于开发配置的示例命令:
cp "$(ProjectDir)GoogleServices\google-services-development.json" "$(ProjectDir)google-services.json"
用于生产配置的示例命令:
cp "$(ProjectDir)GoogleServices\google-services-production.json" "$(ProjectDir)google-services.json"
用于任何配置的示例
.csproj
中的项目。.csproj
,请备份。DebugPro
|DebugBasic
的调试配置,您可以这样包含不同的google-services.json
(来自不同的目录)。<ItemGroup Condition="'$(Configuration)'=='DebugPro'">
<GoogleServicesJson Include="google-services.json">
<Link>Basic\google-services.json</Link>
</GoogleServicesJson>
</ItemGroup>
<ItemGroup Condition="'$(Configuration)'=='DebugBasic'">
<GoogleServicesJson Include="google-services.json">
<Link>Pro\google-services.json</Link>
</GoogleServicesJson>
</ItemGroup>
MSBuild支持一组特定的条件,可以应用于任何允许使用Condition属性的地方。下表解释了这些条件。
(有关条件表达式,请参见链接)
Link
属性? - SushiHangover<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'qaDebug|AnyCPU'">
<AndroidManifest>Properties\AndroidManifest-qa.xml</AndroidManifest>
https://github.com/jamontes79/xamarin-forms-firebase-sample/blob/master/Droid/MainActivity.cs
对于Visual Studio for Mac(版本8.9.4),我使用的语法是:
cp "${ProjectDir}/GoogleServices/google-services-development.json" "${ProjectDir}/google-services.json"
Andrespengineer的解决方案是一个好主意,但我找不到他如何切换构建配置,因为你不能在构建事件页面更改它。
所以我只输入了一次,并将其从.csproj文件的末尾移动到我的属性组的末尾:
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release-Prod|AnyCPU'">
...
<PreBuildEvent>COPY /Y "$(ProjectDir)GoogleServices\prod\google-services.json" "$(ProjectDir)google-services.json"</PreBuildEvent>
</PropertyGroup>