The semantic-release-replace-plugin plugin provides functionality to update version strings throughout a project. This enables semantic release to be used in many different languages and build processes.
Read more about Semantic Release.
$ npm install https://github.com/centralnicgroup-opensource/semantic-release-replace-plugin -DThe following example uses this plugin to demonstrate using semantic-release in a Python package where __VERSION__ is defined in the root __init__.py file.
{
"plugins": [
"@semantic-release/commit-analyzer",
[
"semantic-release-replace-plugin",
{
"replacements": [
{
"files": ["foo/**/*.py"],
"from": "__VERSION__ = \".*\"",
"to": "__VERSION__ = \"${nextRelease.version}\"",
"ignore": ["foo/go.py"],
"results": [
{
"file": "foo/__init__.py",
"hasChanged": true,
"numMatches": 1,
"numReplacements": 1
}
],
"countMatches": true
}
]
}
],
[
"@semantic-release/git",
{
"assets": ["foo/**/*.py"]
}
]
]
}{
"replacements": [
{
"files": ["./modules/addons/cnicdnsmanager/whmcs.json"],
"from": "\"version\": \"\\d+\\.\\d+\\.\\d+\"",
"to": "\"version\": \"${nextRelease.version}\"",
"countMatches": true
}
]
}{
"replacements": [
{
"files": ["./build.gradle"],
"from": "version = '[^']+'",
"to": "version = '${nextRelease.version}'",
"countMatches": true
}
]
}{
"replacements": [
{
"files": ["./release.json", "./COPYRIGHTS"],
"from": "(19|20)\\d{2}[- /.](0[1-9]|1[012])[- /.](0[1-9]|[12]\\d|3[01])",
"to": "${(new Date()).toISOString().split('T')[0]}",
"countMatches": true,
"results": [
{
"file": "./release.json",
"hasChanged": true,
"numMatches": 1,
"numReplacements": 1
},
{
"file": "./COPYRIGHTS",
"hasChanged": true,
"numMatches": 1,
"numReplacements": 1
}
]
}
]
}The presence of the results array will trigger validation that a replacement has been made. This is optional but recommended.
This plugin will not commit changes unless you specify assets for the @semantic-release/git plugin! This is highlighted below.
[
"@semantic-release/git",
{
"assets": ["foo/*.py"]
}
]
Problem: "No files found matching pattern"
Solutions:
- Verify glob pattern is correct (use
foo/**/*.pynotfoo/**.py) - Check file paths relative to project root
- Use
countMatches: trueto get detailed feedback - Test your regex pattern at regex101.com
Problem: Regex pattern not matching (common in .releaserc.json)
Remember: In JSON, backslashes must be escaped with another backslash:
- ❌ Wrong:
"from": "\d+\.\d+" - ✅ Correct:
"from": "\\d+\\.\\d+"
Rule: Double every backslash in JSON strings
Problem: "Expected match not found"
Check:
- Does the file actually exist?
- Is the glob pattern matching the right file?
- Do the
numMatchesandnumReplacementsmatch actual replacements? - Is
countMatches: trueenabled?
- Enable verbose logging: The plugin logs all matched files and replacements
- Start simple: Test with a single replacement first
- Use
resultsvalidation: It forces you to be explicit about expectations - Test regex patterns separately: Use online tools before adding to config
Please refer to the documentation for more options.