Увеличение номера версии, содержащейся в текстовом файле - PullRequest
0 голосов
/ 12 марта 2020

Этот вопрос с автоответчиком касается сценария, первоначально описанного в Увеличение номера версии в файле :

Номер версии, встроенный в текстовый файл, должен быть увеличен.

Пример содержимого текстового файла:

nuspec{
    id = XXX;
    version: 0.0.30;
    title: XXX;

Например, я хочу, чтобы встроенный номер версии 0.0.30 был обновлен до 0.0.31.

Можно предположить, что интересующая линия соответствует следующему регулярное выражение: ^\s+version: (.+);$

Обратите внимание, что целью является не замена номера версии исправленной новой версией, а увеличение существующей версии .

В идеале логарифм приращения c будет обрабатывать строки версий, представляющие собой [version] (System.Version) или [semver] (System.Management.Automation.SemanticVersion) экземпляров, начиная с 2 - 4 компонента; например:

  • 1.0
  • 1.0.2
  • 1.0.2.3 - [version] формат (до 4 чисел c компонентов)
  • 1.0.2-preview2 - [semver] формат (до 3 чисел c компонентов), опционально с разделенной на - меткой предварительного просмотра
  • 1.0.2-preview2+001 - то же самое, дополнительно с + разделенная метка сборки

1 Ответ

0 голосов
/ 12 марта 2020

В PowerShell [Core] (v6.1 +) возможно краткое решение:

$file = 'somefile.txt'
(Get-Content -Raw $file) -replace '(?m)(?<=^\s+version: ).+(?=;$)', {
    # Increment the *last numeric* component of the version number.
    # See below for how to target other components.
    $_.Value -replace '(?<=\.)\d+(?=$|-)', { 1 + $_.Value }
  } | Set-Content $file

Примечание:
* В PowerShell [Core] 6+, кодировка UTF-8 без спецификации является кодировкой по умолчанию; используйте -Encoding с Set-Content, если вам нужна другая кодировка.
* Используя -Raw, команда сначала считывает весь файл в память, что позволяет выполнить запись в тот же файл в том же конвейере; однако существует небольшой риск потери данных в случае прерывания обратной записи во входной файл.
* -replace неизменно заменяет все подстроки, соответствующие регулярному выражению.
* Параметр встроенного регулярного выражения (?m) гарантирует, что ^ и $ соответствуют началу и концу отдельных строк , что необходимо из-за того, что Get-Content -Raw читает весь файл как одну многострочную строку.

Примечание:

  • Для простоты текстовое манипулирование строкой версии выполняется , но Вы также можете преобразовать $_.Value в [version] или [semver] (только PowerShell [Core] v6 +) и работать с этим.
    Преимущество текстовых манипуляций заключается в краткой способности сохранять все другие компоненты входная строка версии, как есть, без добавления ранее неуказанных.

  • Вышеприведенное опирается на способность -replace оператора выполнять подстановку строк на основе регулярных выражений полностью динамически, через блок скриптов ({ ... }) - как объяснено в этом ответе .

  • Регулярные выражения используют look - круглые утверждения ((?<=...) и (?=...)), чтобы обеспечить соответствие только части изменяемого входа.

    • Только (?<=^\s+version: ) и (?=;$) Обозначения указаны c для формата файла примера; отрегулируйте эти части так, чтобы они соответствовали номеру версии в формате вашего файла.

Приведенный выше прирост составляет компонент последней цифры входной версии c. Чтобы нацелился на различные компоненты номера версии , используйте вместо этого следующее внутреннее регулярное выражение:

  • Увеличьте major number (например, 2.0.9 -> 3.0.9):

    • '2.0.9' -replace '\d+(?=\..+)', { 1 + [int] $_.Value }
  • несовершеннолетний число :

    • '2.0.9' -replace '(?<=^\d+\.)\d+(?=.*)', { 1 + [int] $_.Value }
  • Патч / сборка число (3-й компонент; 2.0.9 -> 2.0.10):

    • '2.0.9' -replace '(?<=^\d+\.\d+\.)\d+(?=.*)', { 1 + [int] $_.Value }
  • последний / ревизия номер , как указано выше, независимо от того, что это такое, даже если за ним следует метка предварительного выпуска (например ,; 2.0.9.10 -> 2.0.9.11 или 7.0.0-preview2 -> 7.0.1-preview2):

    • '2.0.9.10' -replace '(?<=\.)\d+(?=$|-)', { 1 + [int] $_.Value }

Примечание. Если целевой компонент не существует, исходный версия возвращается как есть.


В Windows PowerShell , где -replace не поддерживает замены на основе блоков сценариев, вы можете использовать switch оператор с -File и -Regex варианты вместо:

$file = 'someFile.txt'
$updatedFileContent = 
  switch -regex -file $file { # Loop over all lines in the file.

    '^\s+version: (.+);$' { # line with version number

      # Extract the old version number...
      $oldVersion = $Matches[1]

      # ... and update it, by incrementing the last component in this
      # example.
      $components = $oldVersion -split '\.'
      $components[-1] = 1 + $components[-1]

      $newVersion = $components -join '.'

      # Replace the old version with the new version in the line
      # and output the modified line.
      $_.Replace($oldVersion, $newVersion)

    }

    default { # All other lines.
      # Pass them through.
      $_ 
    }
}

# Save back to file. Use -Encoding as needed.
$updatedFileContent | Set-Content $file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...