开发者发布流程#
要发布 widgets 在 PyPI 和 npm 上的新版本,首先请检出 main 分支,并 cd 进入代码库根目录。
cd release
conda deactivate
conda remove --all -y -n releasewidgets
rm -rf ipywidgets
conda create -c conda-forge --override-channels -y -n releasewidgets notebook nodejs "yarn=3.*" twine jupyterlab=4 jupyter-packaging python-build jq "python==3.9.*"
conda activate releasewidgets
git clone git@github.com:jupyter-widgets/ipywidgets.git
cd ipywidgets
修复小组件规范#
如果小部件模型规范有变化(即对任何小部件属性进行的任何更改),我们需要更新模型规范版本并记录已记录的属性。
首先,更新相关的模型规范版本。例如,提交 https://github.com/jupyter-widgets/ipywidgets/commit/fca6f355605dc9e04062ce0eec4a7acbb5632ae2 更新了控制模型版本。我们遵循 semver 规范来处理模型版本号,因此向后不兼容的模型更改应当进行主版本号升级,而向后兼容的新增功能则应当进行次版本号升级。
接下来,在存储库根目录中通过类似以下操作来使用新版本号重新生成模型规范:
(cd python/ipywidgets; pip install -e .)
python ./packages/schema/generate-spec.py -f json-pretty packages/schema/jupyterwidgetmodels.latest.json
python ./packages/schema/generate-spec.py -f markdown packages/schema/jupyterwidgetmodels.latest.md
复制 packages/schema/jupyterwidgetmodels.latest.md 到一个适当命名的
markdown 文件中(请参考该目录下现有的模型规范文件以了解命名约定)。这记录了特定 ipywidget 版本的
小部件模型规范。
提交更改(别忘了git add新的模型规范文件)。
发布npm模块#
# clean out all dirty files
git checkout main
git pull origin main
git reset --hard origin/main
git clean -fdx
yarn install
yarn run bump
# Check the latest commit to make sure it is correct
yarn publish
Lerna将在版本步骤中提示您为每个更改的npm包输入版本号。然后,Lerna将相应地更改版本(包括相互依赖的版本),提交并打标签。接着,yarn publish步骤将已版本化的公共包发布到npm。
配置 twine 用户名#
如果您启用了双因素认证,请确保您的~/.pypirc文件设置为:
[pypi]
username = __token__
或者设置环境变量
export TWINE_USERNAME=__token__
jupyterlab_widgets#
进入python/jupyterlab_widgets目录。更改jupyterlab_widgets/_version.py以反映新的版本号。
(cd python/jupyterlab_widgets && pyproject-build . && twine upload dist/*)
验证包已上传。
curl -s https://pypi.org/pypi/jupyterlab-widgets/json | jq -r '[.releases[][] | [.upload_time, .digests.sha256, .filename] | join(" ")] | sort '
小部件笔记本扩展#
进入 python/widgetsnbextension 目录。更改 widgetsnbextension/_version.py 以反映新的版本号。
(cd python/widgetsnbextension && pyproject-build . && twine upload dist/*)
验证包已上传。
curl -s https://pypi.org/pypi/widgetsnbextension/json | jq -r '[.releases[][] | [.upload_time, .digests.sha256, .filename] | join(" ")] | sort '
ipywidgets#
进入 python/ipywidgets 目录。修改 ipywidgets/_version.py 以反映新的版本号,如果需要,还要修改新的 __html_manager_version__。更改 setup.cfg 中的 install_requires 参数,以引用新的 widgetsnbextension 和 jupyterlab_widgets 版本。
(cd python/ipywidgets && pyproject-build . && twine upload dist/*)
验证该包是否已上传:
curl -s https://pypi.org/pypi/ipywidgets/json | jq -r '[.releases[][] | [.upload_time, .digests.sha256, .filename] | join(" ")] | sort '
推送变更回#
计算上传文件的哈希值。您可以使用一个小的shell脚本,例如在macOS上这样操作(放在scripts/hashes中):
#!/bin/sh
for f in $@
do
echo "$f"
echo md5: `md5 -q "$f"`
echo sha1: `shasum -a 1 "$f" | awk '{print $1}'`
echo sha256: `shasum -a 256 "$f" | awk '{print $1}'`
echo
done
使用上面的脚本,您可以执行:
./scripts/hashes python/ipywidgets/dist/*
./scripts/hashes python/widgetsnbextension/dist/*
./scripts/hashes python/jupyterlab_widgets/dist/*
提交您在上面所做的更改,并在提交信息中包含上传文件的哈希值。如果ipywidgets已发布,则标记该发布。推送到源 main (并在推送中包含标签),例如:
git add -p
git commit -m "Release: ipywidgets 8.1.3, widgetsnbextension 4.0.11, jupyterlab_widgets 3.0.11"
git commit --amend
git tag 8.1.3
git push origin main 8.1.3
更新 conda-forge 包(如果需求更改为 ipywidgets,请确保首先更新 widgetsnbextension)。
版本说明#
更新日志#
修改
scripts/milestone_check.py以包含发布版本和提交范围,并运行python scripts/milestone_check.py来检查分配给此里程碑的问题撰写发布亮点。您可以使用下面生成的列表作为起点:
loghub jupyter-widgets/ipywidgets -m XXX -t $GITHUB_TOKEN --template scripts/release_template.txt
示例#
以下是一个ipywidgets 7.0的发布统计数据示例。
距上一次发布已过去157天。在此版本中,我们关闭了127个问题和216个拉取请求,进行了1069次提交,其中851次为非合并提交。
以下是用于生成上述统计信息的一些命令。
# merges since in 6.0.0, but not 7.0.0, which is a rough list of merged PRs
git log --merges 6.0.0...main --pretty=oneline
# To really make sure we get all PRs, we could write a program that
# pulled all of the PRs, examined a commit in each one, and did
# `git tag --contains <commit number>` to see if that PR commit is included
# in a previous release.
# issues closed with no milestone in the time period
# is:issue is:closed closed:"2016-07-14 .. 2017-02-28"
# date of 6.0.0 tag
git show -s --format=%cd --date=short 6.0.0^{commit}
# Non-merge commits in 7.0.0 not in any 6.x release
git log --pretty=oneline --no-merges ^6.0.0 main | wc -l
# Authors of non-merge commits
git shortlog -s 6.0.0..main --no-merges | cut -c8- | sort -f
# New committers: authors unique in the 6.0.0..7.0.0 logs, but not in the 6.0.0 log
comm -23 <(git shortlog -s -n 6.0.0..main --no-merges | cut -c8- | sort) <(git shortlog -s -n 6.0.0 --no-merges | cut -c8- | sort) | sort -f