Automate packaging of Visual Studio Code extension

During my work with the Visual Studio Code extension AngularTools I more than once annoyingly forgot one of the steps in the deployment.

Its not a complicated set of tasks but in my list of things to do when packaging a new version I have to:

  • Verify that the version number in the package.json has been updated.
  • Verify that the CHANGELOG.md file has been updated with a description of bugfixes and new features.
  • Create a tag for the version in the Git repository.
  • Run vsce package to create the vsix package file.

So I automated the tasks with the python script below:

<span>import</span> <span>os</span>
<span>import</span> <span>json</span>
<span>import</span> <span>re</span>
<span>from</span> <span>git</span> <span>import</span> <span>Repo</span><span>,</span> <span>TagReference</span>
<span>def</span> <span>readVersionFromPackageJson</span><span>():</span>
<span>packageJson</span> <span>=</span> <span>open</span><span>(</span><span>"</span><span>package.json</span><span>"</span><span>,</span> <span>"</span><span>r</span><span>"</span><span>)</span>
<span>contentRaw</span> <span>=</span> <span>packageJson</span><span>.</span><span>read</span><span>()</span>
<span>contentJson</span> <span>=</span> <span>json</span><span>.</span><span>loads</span><span>(</span><span>contentRaw</span><span>)</span>
<span>packageJson</span><span>.</span><span>close</span><span>()</span>
<span>return</span> <span>contentJson</span><span>[</span><span>"</span><span>version</span><span>"</span><span>]</span>
<span>def</span> <span>isPackageJsonVersionTagged</span><span>(</span><span>repo</span><span>,</span> <span>packageJsonVersion</span><span>):</span>
<span>packageJsonVersionTagFound</span> <span>=</span> <span>False</span>
<span>for</span> <span>tag</span> <span>in</span> <span>repo</span><span>.</span><span>tags</span><span>:</span>
<span>if</span> <span>tag</span><span>.</span><span>name</span> <span>==</span> <span>packageJsonVersion</span><span>:</span>
<span>packageJsonVersionTagFound</span> <span>=</span> <span>True</span>
<span>break</span>
<span>return</span> <span>packageJsonVersionTagFound</span>
<span>def</span> <span>isChangeLogUpdatedWithPackageJsonVersion</span><span>(</span><span>packageJsonVersion</span><span>):</span>
<span>packageJsonVersionChangeLogEntryFound</span> <span>=</span> <span>False</span>
<span>changeLog</span> <span>=</span> <span>open</span><span>(</span><span>"</span><span>CHANGELOG.md</span><span>"</span><span>,</span> <span>"</span><span>r</span><span>"</span><span>)</span>
<span>changeLogContent</span> <span>=</span> <span>changeLog</span><span>.</span><span>readlines</span><span>()</span>
<span>changeLog</span><span>.</span><span>close</span><span>()</span>
<span>for</span> <span>line</span> <span>in</span> <span>changeLogContent</span><span>:</span>
<span>match</span> <span>=</span> <span>re</span><span>.</span><span>search</span><span>(</span><span>f</span><span>"</span><span>^## Version </span><span>{</span><span>packageJsonVersion</span><span>}</span><span>$</span><span>"</span><span>,</span> <span>line</span><span>)</span>
<span>if</span> <span>match</span><span>:</span>
<span>packageJsonVersionChangeLogEntryFound</span> <span>=</span> <span>True</span>
<span>break</span>
<span>return</span> <span>packageJsonVersionChangeLogEntryFound</span>
<span>def</span> <span>packageExtension</span><span>():</span>
<span>os</span><span>.</span><span>system</span><span>(</span><span>"</span><span>vsce package</span><span>"</span><span>)</span>
<span>def</span> <span>main</span><span>():</span>
<span>packageJsonVersion</span> <span>=</span> <span>readVersionFromPackageJson</span><span>()</span>
<span>repo</span> <span>=</span> <span>Repo</span><span>(</span><span>"</span><span>./</span><span>"</span><span>)</span>
<span>packageJsonVersionTagFound</span> <span>=</span> <span>isPackageJsonVersionTagged</span><span>(</span><span>repo</span><span>,</span> <span>packageJsonVersion</span><span>)</span>
<span>packageJsonVersionChangeLogEntryFound</span> <span>=</span> <span>isChangeLogUpdatedWithPackageJsonVersion</span><span>(</span><span>packageJsonVersion</span><span>)</span>
<span>if</span> <span>not</span> <span>packageJsonVersionChangeLogEntryFound</span><span>:</span>
<span>print</span><span>(</span><span>"</span><span>Fail: CHANGELOG.md not update!</span><span>"</span><span>)</span>
<span>else</span><span>:</span>
<span>if</span> <span>not</span> <span>packageJsonVersionTagFound</span><span>:</span>
<span>print</span><span>(</span><span>f</span><span>"</span><span>New version found in package.json: </span><span>{</span><span>packageJsonVersion</span><span>}</span><span>.</span><span>"</span><span>)</span>
<span>print</span><span>(</span><span>"</span><span>Creating tag in Git...</span><span>"</span><span>)</span>
<span>repo</span><span>.</span><span>create_tag</span><span>(</span><span>packageJsonVersion</span><span>)</span>
<span>print</span><span>(</span><span>"</span><span>Creating vsix package...</span><span>"</span><span>)</span>
<span>packageExtension</span><span>()</span>
<span>else</span><span>:</span>
<span>print</span><span>(</span><span>f</span><span>"</span><span>Fail: Version already tagged: </span><span>{</span><span>packageJsonVersion</span><span>}</span><span>.</span><span>"</span><span>)</span>
<span>print</span><span>(</span><span>"</span><span>No vsix package created</span><span>"</span><span>)</span>
<span>main</span><span>()</span>
<span>import</span> <span>os</span>
<span>import</span> <span>json</span>
<span>import</span> <span>re</span>
<span>from</span> <span>git</span> <span>import</span> <span>Repo</span><span>,</span> <span>TagReference</span>

<span>def</span> <span>readVersionFromPackageJson</span><span>():</span>
  <span>packageJson</span> <span>=</span> <span>open</span><span>(</span><span>"</span><span>package.json</span><span>"</span><span>,</span> <span>"</span><span>r</span><span>"</span><span>)</span>
  <span>contentRaw</span> <span>=</span> <span>packageJson</span><span>.</span><span>read</span><span>()</span>
  <span>contentJson</span> <span>=</span> <span>json</span><span>.</span><span>loads</span><span>(</span><span>contentRaw</span><span>)</span>
  <span>packageJson</span><span>.</span><span>close</span><span>()</span>
  <span>return</span> <span>contentJson</span><span>[</span><span>"</span><span>version</span><span>"</span><span>]</span>

<span>def</span> <span>isPackageJsonVersionTagged</span><span>(</span><span>repo</span><span>,</span> <span>packageJsonVersion</span><span>):</span>
  <span>packageJsonVersionTagFound</span> <span>=</span> <span>False</span>
  <span>for</span> <span>tag</span> <span>in</span> <span>repo</span><span>.</span><span>tags</span><span>:</span>
    <span>if</span> <span>tag</span><span>.</span><span>name</span> <span>==</span> <span>packageJsonVersion</span><span>:</span>
      <span>packageJsonVersionTagFound</span> <span>=</span> <span>True</span>
      <span>break</span>
  <span>return</span> <span>packageJsonVersionTagFound</span>

<span>def</span> <span>isChangeLogUpdatedWithPackageJsonVersion</span><span>(</span><span>packageJsonVersion</span><span>):</span>
  <span>packageJsonVersionChangeLogEntryFound</span> <span>=</span> <span>False</span>
  <span>changeLog</span> <span>=</span> <span>open</span><span>(</span><span>"</span><span>CHANGELOG.md</span><span>"</span><span>,</span> <span>"</span><span>r</span><span>"</span><span>)</span>
  <span>changeLogContent</span> <span>=</span> <span>changeLog</span><span>.</span><span>readlines</span><span>()</span>
  <span>changeLog</span><span>.</span><span>close</span><span>()</span>
  <span>for</span> <span>line</span> <span>in</span> <span>changeLogContent</span><span>:</span>
    <span>match</span> <span>=</span> <span>re</span><span>.</span><span>search</span><span>(</span><span>f</span><span>"</span><span>^## Version </span><span>{</span><span>packageJsonVersion</span><span>}</span><span>$</span><span>"</span><span>,</span> <span>line</span><span>)</span>
    <span>if</span> <span>match</span><span>:</span>
      <span>packageJsonVersionChangeLogEntryFound</span> <span>=</span> <span>True</span>
      <span>break</span>
  <span>return</span> <span>packageJsonVersionChangeLogEntryFound</span>

<span>def</span> <span>packageExtension</span><span>():</span>
  <span>os</span><span>.</span><span>system</span><span>(</span><span>"</span><span>vsce package</span><span>"</span><span>)</span>

<span>def</span> <span>main</span><span>():</span>
  <span>packageJsonVersion</span> <span>=</span> <span>readVersionFromPackageJson</span><span>()</span>
  <span>repo</span> <span>=</span> <span>Repo</span><span>(</span><span>"</span><span>./</span><span>"</span><span>)</span>
  <span>packageJsonVersionTagFound</span> <span>=</span> <span>isPackageJsonVersionTagged</span><span>(</span><span>repo</span><span>,</span> <span>packageJsonVersion</span><span>)</span>
  <span>packageJsonVersionChangeLogEntryFound</span> <span>=</span> <span>isChangeLogUpdatedWithPackageJsonVersion</span><span>(</span><span>packageJsonVersion</span><span>)</span>

  <span>if</span> <span>not</span> <span>packageJsonVersionChangeLogEntryFound</span><span>:</span>
    <span>print</span><span>(</span><span>"</span><span>Fail: CHANGELOG.md not update!</span><span>"</span><span>)</span>
  <span>else</span><span>:</span>
    <span>if</span> <span>not</span> <span>packageJsonVersionTagFound</span><span>:</span>
      <span>print</span><span>(</span><span>f</span><span>"</span><span>New version found in package.json: </span><span>{</span><span>packageJsonVersion</span><span>}</span><span>.</span><span>"</span><span>)</span>
      <span>print</span><span>(</span><span>"</span><span>Creating tag in Git...</span><span>"</span><span>)</span>
      <span>repo</span><span>.</span><span>create_tag</span><span>(</span><span>packageJsonVersion</span><span>)</span>
      <span>print</span><span>(</span><span>"</span><span>Creating vsix package...</span><span>"</span><span>)</span>
      <span>packageExtension</span><span>()</span>
    <span>else</span><span>:</span>
      <span>print</span><span>(</span><span>f</span><span>"</span><span>Fail: Version already tagged: </span><span>{</span><span>packageJsonVersion</span><span>}</span><span>.</span><span>"</span><span>)</span>
      <span>print</span><span>(</span><span>"</span><span>No vsix package created</span><span>"</span><span>)</span>

<span>main</span><span>()</span>
import os import json import re from git import Repo, TagReference def readVersionFromPackageJson(): packageJson = open("package.json", "r") contentRaw = packageJson.read() contentJson = json.loads(contentRaw) packageJson.close() return contentJson["version"] def isPackageJsonVersionTagged(repo, packageJsonVersion): packageJsonVersionTagFound = False for tag in repo.tags: if tag.name == packageJsonVersion: packageJsonVersionTagFound = True break return packageJsonVersionTagFound def isChangeLogUpdatedWithPackageJsonVersion(packageJsonVersion): packageJsonVersionChangeLogEntryFound = False changeLog = open("CHANGELOG.md", "r") changeLogContent = changeLog.readlines() changeLog.close() for line in changeLogContent: match = re.search(f"^## Version {packageJsonVersion}$", line) if match: packageJsonVersionChangeLogEntryFound = True break return packageJsonVersionChangeLogEntryFound def packageExtension(): os.system("vsce package") def main(): packageJsonVersion = readVersionFromPackageJson() repo = Repo("./") packageJsonVersionTagFound = isPackageJsonVersionTagged(repo, packageJsonVersion) packageJsonVersionChangeLogEntryFound = isChangeLogUpdatedWithPackageJsonVersion(packageJsonVersion) if not packageJsonVersionChangeLogEntryFound: print("Fail: CHANGELOG.md not update!") else: if not packageJsonVersionTagFound: print(f"New version found in package.json: {packageJsonVersion}.") print("Creating tag in Git...") repo.create_tag(packageJsonVersion) print("Creating vsix package...") packageExtension() else: print(f"Fail: Version already tagged: {packageJsonVersion}.") print("No vsix package created") main()

Enter fullscreen mode Exit fullscreen mode

I hope you find it useful or that it will inspire you to automate some of your boring or annoying tasks.

You can find the script and the code for AngularTools on GitHub.

原文链接:Automate packaging of Visual Studio Code extension

© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享
Not all of us can offord to be romantic.
并不是我们所有的人都会拥有浪漫
评论 抢沙发

请登录后发表评论

    暂无评论内容