使用Tuist与SwiftGen生成Objective-C兼容本地化字符串遇异常求助
使用Tuist+SwiftGen生成Objective-C本地化字符串的配置问题解决
问题描述
- 需求:通过Tuist和SwiftGen生成Objective-C可用的本地化字符串文件
- 异常:生成的
TuistStrings+{name}.strings文件内容与stencil模板完全一致,未完成模板变量渲染 - 额外现象:将模板重命名为
Assets.stencil后,TuistAssets文件也出现相同问题
当前配置代码
Manifests/Project.swift
let project = Project( name: "{name}", organizationName: "{name}", settings: .settings( configurations: Configuration.{name}Configuration(basic: true) ), targets: targets, schemes: schemes, resourceSynthesizers: [ .strings(), .assets() ] )
Stencil模板配置
strings: inputs: path/to/Localizable.strings outputs: - templateName: objc-h output: Localizable.h - templateName: objc-m output: Localizable.m
解决方案
1. 规范模板文件的位置与命名
- Tuist的资源合成器默认读取
Tuist/ResourceSynthesizers目录下的模板,需将Objective-C本地化模板命名为Strings.stencil并放置在此路径下,避免与Assets模板混淆。
2. 显式配置resourceSynthesizers
默认的.strings()合成器不会加载自定义模板,需修改Project.swift中的配置,指定模板路径与输出规则:
resourceSynthesizers: [ .strings( parser: .strings, templatePath: "Tuist/ResourceSynthesizers/Strings.stencil", output: .relativeToRoot("Generated/Localizable") ), .assets() ]
templatePath:对应你的实际模板文件路径output:指定生成文件的输出目录
3. 检查模板语法正确性
确保stencil模板中使用了SwiftGen提供的变量,比如Objective-C头文件模板示例:
// Localizable.h #import <Foundation/Foundation.h> NS_ASSUME_NONNULL_BEGIN {% for entry in entries %} extern NSString *const {{ entry.key }}; {% endfor %} NS_ASSUME_NONNULL_END
若未正确使用变量,生成内容会与原模板完全一致。
4. 验证SwiftGen集成配置
在Tuist/Config.swift中添加SwiftGen版本配置,确保Tuist能正确调用SwiftGen:
import TuistCore import TuistSupport let config = Config( swiftVersion: "5.9", plugins: [], resourceSynthesizers: .enabled, swiftGenVersion: .exact("6.6.0") )
5. 清理缓存并重新生成项目
执行以下命令确保配置生效:
tuist clean tuist generate
内容的提问来源于stack exchange,提问作者Killianoni
相关产品推荐
相关产品推荐

