使用Renovate对 stylelint包进行分组

移动开发 2026-07-09

使用Renovate时,我想把 stylelint 包的更新,与其相关的编码规范依赖合并分组,以避免跨越分离合并请求时出现循环依赖解析冲突。

我在 packageRules 节下尝试了两种方法。

第一种,手动:

{
  groupName: "stylelint packages",
  groupSlug: "stylelint",
  matchCategories: ["js"],
  matchPackageNames: [
    'stylelint',
    'stylelint-config-recommended',
    'stylelint-config-standard',
  ]
}

然后,使用预定义的 packages:stylelint 供应商预设:

{
  extends: ["packages:stylelint"],
  groupName: "stylelint packages",
  groupSlug: "stylelint",
},

都不起作用,Renovate仍然在提出两个分开的更新:

分离的 MR 提议

如果我在列表中同时选择这两个提议,就会创建两个独立的合并请求。

我该如何解决这个问题?

以下是其余的配置,以防这里的某些设置导致行为与预期不符:

const prBodyColumns = [
  'Package',
  'Type',
  'Update',
  'Change',
];

/**
 * @see https://docs.renovatebot.com/self-hosted-configuration/
 * @see https://docs.renovatebot.com/configuration-options/
 * @see https://docs.renovatebot.com/config-presets/
 */
module.exports = {
  extends: [
    ':pinAllExceptPeerDependencies',
    ':dependencyDashboard',
    ':ignoreModulesAndTests',
    ':semanticCommits',
    ':separateMultipleMajorReleases',
    'group:monorepos',
    'group:recommended',
    'workarounds:all',
  ],
  timezone: 'Europe/Paris',
  autodiscover: false,
  npmrc: '@ss-open:registry=https://gitlab.com/api/v4/packages/npm/',
  persistRepoData: true,
  onboarding: false,
  platform: 'gitlab',
  platformAutomerge: true,
  automergeType: 'pr',
  prConcurrentLimit: 10,
  gitLabIgnoreApprovals: true,
  requireConfig: 'optional',
  commitBodyTable: true,
  stabilityDays: 3,
  major: {
    dependencyDashboardApproval: true,
    gitLabIgnoreApprovals: false,
  },
  prBodyDefinitions: {
    // @see https://github.com/whitesource/merge-confidence/blob/main/beta.json
    Age: "[![age](https://badges.renovateapi.com/packages/{{datasource}}/{{replace '/' '%2f' depName}}/{{{toVersion}}}/age-slim)](https://docs.renovatebot.com/merge-confidence/)",
    Adoption: "[![adoption](https://badges.renovateapi.com/packages/{{datasource}}/{{replace '/' '%2f' depName}}/{{{toVersion}}}/adoption-slim)](https://docs.renovatebot.com/merge-confidence/)",
    Passing: "[![passing](https://badges.renovateapi.com/packages/{{datasource}}/{{replace '/' '%2f' depName}}/{{{toVersion}}}/compatibility-slim/{{{fromVersion}}})](https://docs.renovatebot.com/merge-confidence/)",
    Confidence: "[![confidence](https://badges.renovateapi.com/packages/{{datasource}}/{{replace '/' '%2f' depName}}/{{{toVersion}}}/confidence-slim/{{{fromVersion}}})](https://docs.renovatebot.com/merge-confidence/)",
  },
  // https://sourcegraph.com/search/badge?q=repo:github.com/babel/babel+case:yes+-file:package-lock.json+babel/babel&label=matches
  // https://sourcegraph.com/search?q=repo:github.com/babel/babel+case:yes+-file:package-lock.json+babel/babel
  prBodyColumns,
  hostRules: [
    {
      hostType: 'npm',
      matchHost: 'https://gitlab.com/api/v4/packages/npm/',
      token: process.env.GITLAB_TOKEN,
    },
    {
      matchHost: process.env.CI_REGISTRY,
      username: process.env.GITLAB_USER,
      password: process.env.GITLAB_TOKEN,
    },
  ],
  packageRules: [
    // @see https://github.com/renovatebot/renovate/issues/7879
    {
      matchDatasources: ['maven', 'npm', 'pypi'],
      updateTypes: ['patch', 'minor', 'major'],
      prBodyColumns: [
        ...prBodyColumns,
        'Age',
        'Adoption',
        'Passing',
        'Confidence',
      ],
    },
    {
      matchManagers: [
        'composer',
        'npm',
      ],
      matchDepTypes: [
        'dependencies',
        'peerDependencies',
        'require',
      ],
      semanticCommitType: 'fix',
    },
    // Weekly schedule
    {
      schedule: [
        'before 4am on Monday',
      ],
      matchPackageNames: [
        'bridgecrew/checkov',
        'renovate/renovate',
      ],
    },
    // Monthly schedule
    {
      schedule: [
        'before 4am on the first day of the month',
      ],
      matchPackageNames: [
        'eslint',
      ],
      matchPackagePrefixes: [
        'ss-open/',
        '@ss-open/',
        'registry.gitlab.com/ss-open/',
      ],
    },
    {
      matchPackagePrefixes: [
        'ss-open/',
        '@ss-open/',
      ],
      dependencyDashboardApproval: false,
      stabilityDays: 0,
      prBodyColumns,
    },
    {
      matchManagers: [
        'gitlabci-include',
      ],
      semanticCommitType: 'ci',
      semanticCommitScope: null,
    },
    {
      matchUpdateTypes: [
        'minor',
        'patch',
        'pin',
      ],
      matchDepTypes: [
        'devDependencies',
        'require-dev',
        'repository',
      ],
      matchPackageNames: [
        'eslint',
        'typescript',
      ],
      matchPackagePrefixes: [
        '@ss-open/',
        '@types/',
        '@typescript-eslint/',
        'eslint-',
        'eslint-',
        'ss-open/',
      ],
      matchPackagePatterns: [
        '/ss-open/',
      ],
      automerge: true,
    },
    // The following packages can not be updated because of the Expo constraints.
    // @see https://github.com/renovatebot/renovate/issues/7417
    {
      matchSourceUrlPrefixes: [
        'https://github.com/expo',
      ],
      updateTypes: ['patch', 'minor', 'major'],
      enabled: false,
    },
    {
      matchPackageNames: [
        '@react-native-community/datetimepicker',
        '@types/react-native',
        'react-native',
        'react-native-gesture-handler',
        'react-native-maps',
        'react-native-reanimated',
        'react-native-safe-area-context',
        'react-native-screens',
        'react-native-svg',
        'react-native-web',
      ],
      updateTypes: ['patch', 'minor', 'major'],
      matchManagers: ['npm'],
      enabled: false,
    },
    // STYLELINT PACKAGE RULES CONFIG -> See previous code block on the post.
  ],
};

由于该项目是开源的,您可以在此处查看相关的进行中的合并请求:https://gitlab.com/ss-open/scheduling/-/merge_requests/84

解决方案

配置块是正确的,问题出在软件包与已激活的 :separateMultipleMajorReleases 之间的主版本差异。因此,Renovate尝试将它们分组,但由于版本差异被迫将合并请求分开。

我们可以通过确保在 packageRules 配置块中不出现分离的版本发布来解决,如下所示:

{
  extends: ["packages:stylelint"],
  groupName: "stylelint packages",
  groupSlug: "stylelint",
  separateMajorMinor: false,
  separateMultipleMajor: false,
}
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章