用于具有私有存储库的git项目的包管理器

qaviton-package-manager的Python项目详细描述


Qaviton包经理

logo
versionlicenseopen issuesdownloadscode size

Qaviton包管理器(qpm)
是与git集成的包管理工具。
要启用包的公共和私有管理,
除了标准包管理器之外,还可以从git存储库中。在

使用qpm更换冗余包装系统:
使用git标记打包所有内容:

>qpm --build
         |
branch: dev
         |
branch: tests
         |  
[tag 2019.9.1] 
         |
[tag 2019.9.2]
         |
branch: release/latest


>qpm --install "git+https://url/owner/project.git@release/latest#egg=package:>=2019.9.2"
  |       |      |   |           |                     |             |              |
qaviton install vcs+protocol://project_url          @branch   #egg=package      (optional) 
package method  type                                              directory   pep-440 pep-508
manager                                                             path     :version_specifier

simply_install

安装

^{pr2}$

要求

  • 吉特2.16+
  • Python 3.6+

特点

  • CI CD工作流✓
  • 管理私有+公共包✓
  • 管理嵌套私有包✓
  • cli+脚本✓
  • pip能力✓
  • git功能✓
  • pypi功能✓
  • 自动生成✓
  • 安全凭据✓
  • 跨平台✓
  • 嵌套/多个包✗
  • pip-e安装✗(即将推出)
  • docker build✗(但可与run函数一起使用)
  • docker push✗(但可与run函数一起使用)

使用

创建经理:

(venv) windows> qpm ^
--create ^
--url "https://github.com/owner/project.git" ^
--username "user1" ^
--password "pass@#$" ^
--email "awsome@qaviton.com" ^
--pypi_user "supasayajin" ^
--pypi_pass "final space" 
(venv) bash$ qpm  \
--create  \
--url "https://github.com/owner/project.git"\
--username "user1"\
--password "pass@#$"\
--email "awsome@qaviton.com"\
--pypi_user "supasayajin"\
--pypi_pass "final space"\
/

这将为您留下以下项目结构:

project/
  ├ package/
  │   └ __init__.py  # with __author__, __version__, __author_email__, __description__, __url__, __license__
  ├ tests/
  │   └ __init__.py
  ├ .gitignore
  ├ LICENSE 
  ├ README.md
  ├ requirements.txt
  ├ requirements-test.txt
  ├ setup.py
  └ package.py  # ignored by .gitignore

现在让我们构建一个包:

# package.pyfromqaviton_package_managerimportManagerfromqaviton_package_managerimportdecypt# if this is not secure enough, you can add cache_timeout=3600 # and store credentials in memory# manager = Manager(cache_timeout=3600)  # and we need to insert the credentials in run time: > python package.py --username "x"  --password "z"manager=Manager(**decypt(key=b'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx==',token=b'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx==',))if__name__=="__main__":# running with lambdas will protect you from processes getting stuckmanager.run(lambda:manager.update(),# pip install -r requirements.txt --upgradelambda:manager.update_test(),# pip install -r requirements-test.txt --upgradelambda:manager.test(),# python -m pytest --junitxml=test_report.xml testslambda:manager.build(),# git commit, tag & push (internal logic is more complicated)lambda:manager.upload(),# upload to pypi)

确保您的包在列表1中通过了测试

# tests/my_package_test.pydeftest_with_100p_coverage():print("testing my package!\nPASS")
# we can now create a package
python package.py

命令行:

我们可以通过cli调用任何方法和发送任何参数给管理器:

# release a version if all tests pass
qpm --username "" --password "" --update --update_test --test --build --upload

# build a stable version if all tests pass
qpm --username "" --password "" --update --update_test --test --build "stable/latest"# install cachetools using pip and save the requirement in requirements.txt
qpm --install cachetools

# cache credentials in memory
qpm --username "" --password "" --cache_timeout "-1"# using the system & python to execute tests
qpm --test "system""echo success" --test "python""-c""print(\"py success\");"

CLI快捷方式:

我们可以通过cli调用任何方法和发送任何参数给管理器:

# install cachetools using pip and save the requirement in requirements.txt
qpm i cachetools

# uninstall cachetools using pip and remove the requirement in requirements.txt
qpm un cachetools

# build a stable version
qpm b "stable/latest"# run tests
qpm t

# upload to pypi
qpm up

# install cachetools using pip and save the requirement in requirements.txt
qpm install cachetools

# build package
qpm build "stable/latest"# upload to pypi
qpm upload

shortcuts_api

脚本:

# ci_cd.pyfromqaviton_processesimportrun,escape,pythonfrompackageimportmanagerfromdatetimeimportdatetimed=datetime.utcnow()docker_url=manager.vars['docker_url']docker_user=manager.vars['docker_user']docker_pass=manager.vars['docker_pass']docker_email=manager.vars['docker_email']SSH_PRIVATE_KEY=manager.kwargs['SSH_PRIVATE_KEY']docker_tag=manager.kwargs['docker_tag']branch_build="ci_cd/latest"dev_branch="dev"manager.run(lambda:manager.should_build(from_branch=dev_branch,to_branch=branch_build),lambda:manager.install(),lambda:manager.install_test(),lambda:manager.test.pytest("tests/ci_cd"),lambda:manager.build(to_branch=branch_build,version=f'{d.year}.{d.month}.{d.day}'),# docker distributelambda:run(f"docker login --username=\"{escape(docker_user)}\" --password=\"{escape(docker_pass)}\" --email=\"{escape(docker_email)}\"\"{escape(docker_url)}\""),lambda:run(f"docker build --force-rm -t test-multi-stage-builds --build-arg SSH_PRIVATE_KEY=\"{escape(SSH_PRIVATE_KEY)}\" ."),lambda:run(f"docker tag {docker_tag} yourhubusername/verse_gapminder:firsttry"),lambda:run("docker push yourhubusername/verse_gapminder"),# deploy scriptlambda:python("deploy.py"))
# schedualer.pyfromtimeimporttime,sleepfromdatetimeimportdatetime,timedeltafromqaviton_processesimportpython_code_asyncd=datetime.utcnow()date=datetime(year=d.year,month=d.month,day=d.day,hour=22)delta=timedelta(days=1)# build a package once a day at 22pmwhileTrue:python_code_async('import ci_cd')date+=deltasleep(date.timestamp()-time())

警告

  • 此管理器用于自动ci cd
    不应使用and代替常规git commit/push/merge。
    避免使用不稳定的分支 以避免失败的打包请求或潜在的数据丢失。
    我们建议从CI-CD专用分支使用它。在

  • 管理器默认为加密凭据,
    如果磁盘上加密的凭据不够安全,
    请确保启用缓存,以便在内存中存储凭据

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
异常如何在java中优雅地处理FileNotFoundexception   java线程卡在BlockingQueue上。无缘无故   类网格程序w/java   StrutsJava:动态应用Velocity脚本   java在运行时重写/禁用方面   java Apache POI无法正确读取Excel单元格中的秒数   具有不同用户权限的Java文件夹/文件创建   java我可以检查Firebase ValueEventListener onDataChanged是否已被调用吗?   尽管获得了用户权限,java Android开发文件权限仍被拒绝   java如何使用JPA映射map<EnumType,Double>?   java是否使用UI线程显示toast消息?   JAVAlang.IllegalArgumentException:不支持的元素:rss   java Android setRequestedOrientation活动和视图生命周期   安卓如何在Java中定义支票盒?   在Java中,对于大输入,字符串解析长期失败   使Java在XP中按计划任务运行读取env用户变量时出现问题   任务“:workflowsjava:NodeDriver”的梯度执行失败。main()   java如何检测是否只设置了部分属性?   在客户端web服务上使用JBossWS时,java无法找到/更改log4j的默认配置   java LibGDX写入文本文件并接收各种错误