You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

寻求类似Repeater的QBS Item实现:基于产品属性实例化QBS项并配置弱依赖

实现QBS中基于产品属性的弱依赖产品(不触发依赖构建)

你要的这个需求其实是QBS里典型的弱依赖消费场景——只处理已经构建好的其他产品输出,绝对不触发它们的构建流程。默认的Depends是强依赖,会强制拉取依赖项构建,所以得换个思路来实现。下面是完整的解决方案:

核心思路拆解

  • 避开强依赖:用FileDepends替代Depends,它只会查找已存在的输出文件,不会触发依赖产品的构建
  • 动态匹配目标产品:通过QBS的项目API获取所有其他产品,结合属性过滤(比如你提到的特定产品属性)来动态实例化依赖项
  • 被动触发处理逻辑:让处理规则仅在有可用输入时才运行,避免无意义的执行

完整代码示例

Product {
    name: "PassiveOutputProcessor"
    type: ["processed-output"] // 自定义类型,避免默认构建行为

    // 这里可以根据你的需求过滤目标产品,比如匹配特定属性
    property var targetProducts: project.products.filter(function(product) {
        // 示例:排除自身,且匹配自定义属性"isProcessable"为true的产品
        return product.name !== name && product.isProcessable === true;
    })

    // 为每个目标产品创建弱依赖(仅关联已存在的输出)
    Repeater {
        model: targetProducts
        delegate: FileDepends {
            // 指定要消费的输出文件标签,比如二进制文件、库文件等
            fileTags: ["bin", "lib"]
            product: modelData // 关联到当前遍历的产品
        }
    }

    // 自定义处理规则:仅当有输入文件时才执行
    Rule {
        inputs: ["bin", "lib"] // 对应上面FileDepends的文件标签
        outputFileTags: ["processed-output"]
        alwaysRun: false // 关键:不主动触发,仅当输入变化/存在时运行

        Artifact {
            filePath: "all_processed_outputs.txt"
            fileTags: ["processed-output"]
        }

        prepare: {
            var processCmd = new Command("cat"); // 示例:合并所有输出文件内容
            inputs.bin.forEach(f => processCmd.arguments.push(f.filePath));
            inputs.lib.forEach(f => processCmd.arguments.push(f.filePath));
            processCmd.arguments.push(">", output.filePath);
            return processCmd;
        }
    }
}

关键细节说明

  1. FileDepends的作用:这是实现弱依赖的核心,它不会触发依赖产品的构建,只会在构建系统中注册“如果这些文件存在,就把它们作为输入”的逻辑。
  2. 动态产品过滤:你可以修改targetProducts的过滤条件,比如根据产品的moduleName、自定义属性等筛选要关联的产品,完全贴合你“基于特定产品属性”的需求。
  3. alwaysRun: false:这个配置确保Rule不会在没有输入的情况下空跑,只有当匹配的输出文件存在时,才会执行处理逻辑。
  4. 自定义类型:给当前产品设置自定义type,可以避免QBS应用默认的构建规则,让我们完全掌控处理流程。

额外调整建议

  • 如果需要针对不同类型的输出做不同处理,可以拆分多个Rule,分别对应不同的fileTags。
  • 如果你不确定依赖产品的fileTags,可以在QBS项目中运行qbs show <product-name>来查看它的输出标签。

内容的提问来源于stack exchange,提问作者Andrei R.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:52:35