82天突破1000star,項目團隊梳理出軟件開源必須注意的8個方面

近期,咱們在GitHub上開源了微服務任務調度框架SIA-TASK,82天,收穫了1000+個star!因爲這是SIA團隊第一次開源項目,開源的相關工做,團隊以前並無太多的經驗,所以咱們特別整理了本次開源的各類記錄事項,但願給從此開源的項目作參考。css

關鍵步驟

  1. 開發
  2. 協議
  3. 安全掃描
  4. 文檔
  5. 版本號
  6. 開源
  7. 後期
  8. 迭代

下面咱們逐個步驟進行闡述。html

1、開發

在開源項目的開發過程當中要注意如下幾點:java

首先,要給本身的項目取一個合適的名字,取名規則這裏再也不贅述,須要強調的一點是:項目名稱不能與GitHub上已開源過的項目名稱相同。git

其次,選擇合適的編程語言。github

再次,編碼過程當中要注意代碼的規範。sql

最後要說的就是開源協議的選擇了,目前最流行的開源協議有如下六種:GPL、BSD、MIT、Mozilla、Apache和LGPL。數據庫

不一樣的開源協議之間的差異仍是挺大的,具體如何選擇,能夠參考一張圖看懂開源協議blog.csdn.net/cwt19902010…apache

爲了更方便查看開源協議選擇圖,參考圖以下編程

以Apache License Version 2.0協議爲例,比較經常使用協議與Apache協議衝突狀況,衝突圖以下:json

2、協議

項目開發完成以後,須要梳理出項目中使用到的協議(包含項目引用的組件中用到的協議),此處推薦使用maven許可證插件。插件配置參見License Maven Pluginwww.mojohaus.org/license-mav… 2.0)

<!--開源協議採用Apache 2.0協議-->
    <licenses>
        <license>
            <name>Apache License, Version 2.0</name>
            <url>http://www.apache.org/licenses/LICENSE-2.0.html</url>
            <distribution>repo</distribution>
        </license>
    </licenses>

    <plugins>
         <plugin>
             <groupId>org.codehaus.mojo</groupId>
             <artifactId>license-maven-plugin</artifactId>
             <version>1.13</version>
             <configuration>
                 <!-- config for license:aggregate-add-third-party -->
                 <outputDirectory>${main.basedir}</outputDirectory>
                 <thirdPartyFilename>LICENSE-3RD-PARTY</thirdPartyFilename>
                 <fileTemplate>/org/codehaus/mojo/license/third-party-file-groupByLicense.ftl</fileTemplate>
                 <useMissingFile>true</useMissingFile>
                 <missingFile>${main.basedir}/LICENSE-3RD-PARTY.properties</missingFile>
                 <aggregateMissingLicensesFile>${main.basedir}/LICENSE-3RD-PARTY.properties</aggregateMissingLicensesFile>
                 <licenseMerges>
                     <licenseMerge>Apache 2.0|ASL, version 2|http://www.apache.org/licenses/LICENSE-2.0.txt|http://asm.ow2.org/license.html|The Apache License, Version 2.0|Apache License|Apache License Version 2|Apache License Version 2.0|Apache Software License - Version 2.0|Apache 2.0 License|Apache License 2.0|ASL|Apache 2|Apache-2.0|the Apache License, ASL Version 2.0|The Apache Software License, Version 2.0|Apache License, Version 2.0|Apache Public License 2.0</licenseMerge>
                     <licenseMerge>BSD|The BSD 3-Clause License|The BSD License|Modified BSD License|New BSD License|New BSD license|Two-clause BSD-style license|BSD licence|BSD New|The New BSD License|BSD 3-Clause|BSD 3-clause</licenseMerge>
                     <licenseMerge>MIT|MIT License|The MIT License</licenseMerge>
                     <licenseMerge>LGPL|LGPL, version 2.1|GNU Library or Lesser General Public License (LGPL) V2.1|GNU Lesser General Public License (LGPL), Version 2.1|GNU Lesser General Public License, Version 2.1|LGPL 2.1</licenseMerge>
                     <licenseMerge>CDDL|CDDL+GPL|CDDL+GPL License|CDDL + GPLv2 with classpath exception|CDDL License|CDDL 1.0|CDDL 1.1|COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0|Common Development and Distribution License (CDDL) v1.0</licenseMerge>
                     <licenseMerge>EPL|Eclipse Public License - Version 1.0</licenseMerge>
                     <licenseMerge>GPL|GPL2 w/ CPE|GPLv2+CE|GNU General Public Library</licenseMerge>
                     <licenseMerge>MPL|MPL 1.1</licenseMerge>
                     <licenseMerge>Public Domain</licenseMerge>
                     <licenseMerge>Common Public License|Common Public License Version 1.0</licenseMerge>
                     <licenseMerge>CC0|CC0 1.0 Universal|Public Domain, per Creative Commons CC0</licenseMerge>
                     <licenseMerge>Unknown License|Unknown license</licenseMerge>
                 </licenseMerges>

                 <!-- config for license:aggregate-download-licenses -->
                 <aggregateDownloadLicenses.executeOnlyOnRootModule>true</aggregateDownloadLicenses.executeOnlyOnRootModule>
                 <!--<licensesConfigFile>${main.basedir}/lic/config/licenses.xml</licensesConfigFile>-->
                 <licensesOutputFile>${main.basedir}/lic/licenses.xml</licensesOutputFile>
                 <licensesOutputDirectory>${main.basedir}/lic/licenses/</licensesOutputDirectory>

                 <!-- config for license:update-file-header -->
                 <licenseName>apache_v2</licenseName>
                 <inceptionYear>2019</inceptionYear>
                 <organizationName>sia</organizationName>
                 <projectName>task</projectName>
                 <roots>
                     <root>src/main/java</root>
                     <root>src/test/java</root>                   
                 </roots>
                 <includes>
                     <include>**/*.java</include>
                     <include>**/*.xml</include>
                     <include>**/*.sh</include>
                     <include>**/*.py</include>
                     <include>**/*.properties</include>
                     <include>**/*.sql</include>
                     <include>**/*.html</include>
                     <include>**/*.less</include>
                     <include>**/*.css</include>
                     <include>**/*.js</include>
                     <include>**/*.json</include>
                 </includes>
                 <canUpdateCopyright>true</canUpdateCopyright>
                 <canUpdateDescription>true</canUpdateDescription>
                 <addJavaLicenseAfterPackage>false</addJavaLicenseAfterPackage>
                 <emptyLineAfterHeader>true</emptyLineAfterHeader>
                 <processStartTag>&lt;&lt;</processStartTag>
                 <processEndTag>&gt;&gt;</processEndTag>
                 <sectionDelimiter>==</sectionDelimiter>

                 <!-- config for mvn license:update-project-license -->
                 <licenseFile>${main.basedir}/LICENSE</licenseFile>
             </configuration>
         </plugin>
         <plugin>
             <groupId>org.jasig.maven</groupId>
             <artifactId>maven-notice-plugin</artifactId>
             <version>1.0.6.1</version>
             <configuration>
                 <generateChildNotices>false</generateChildNotices>
                 <noticeTemplate>https://source.jasig.org/licenses/NOTICE.template</noticeTemplate>
                 <licenseMapping>
                     <param>https://source.jasig.org/licenses/license-mappings.xml</param>
                 </licenseMapping>
             </configuration>
         </plugin>
     </plugins>

複製代碼

配置完成以後,執行以下命令便可生成相應的協議到對應的文件,命令以下:

#### Updates (or creates) the main project license file according to the license defined in the licenseName parameter.
`mvn license:update-project-license`

#### Generates a file containing a list of all dependencies and their licenses for a multi-module build.
`mvn license:aggregate-add-third-party`

#### Downloads the license files associated with each dependency for a multi-modules build.
`mvn license:aggregate-download-licenses`

#### Generate NOTICE?
`mvn notice:generate`

複製代碼

項目開源時,須要在源文件的頂部添加一個保護許可,修改、檢查、刪除源文件頭部保護許可命令以下:

#### how to generate/update source code header?
## Updates the license header of the current project source files.
mvn license:update-file-header
## Checks the license header of the current project source files.
mvn license:check-file-header
## Remove any license header of the current project source files.
mvn license:remove-file-header

複製代碼

執行完上述命令以後,會生成幾個協議文件,其中有兩個關鍵的文件:

LICENSE文件:存放當前開源項目中用到的開源協議信息。 </br>
LICENSE-3RD-PARTY文件:組件使用到的協議。</br>
複製代碼

在LICENSE-3RD-PARTY文件中查看組件使用的協議,參考前面介紹的各協議衝突狀況,查看看組件中用到的協議是否與當前開源項目選擇的開源協議有衝突,若是有衝突,須要替換掉協議衝突的接口。

3、安全掃描

安全掃描是項目開源流程中必不可少的一步,安全掃描關注的點主要有如下幾個:

  • 組件層面安全問題。好比:組件是否存在遠程代碼執行風險、XXE風險等。
  • 代碼層面安全問題。好比:RequestMapping上請求未限制方法等。
  • 公司敏感信息是否外泄。好比:數據庫鏈接信息、郵箱信息等被暴露。

備註:安全掃描工做由安所有·安全服務團隊的同事負責完成,項目開發完成以後,可聯繫安全服務團隊的同事進行代碼安全掃描工做。

4、文檔

README文檔至關於開源項目的一個門面,若是README文檔寫得好,可以讓用戶更瞭解開源項目的功能,減小用戶的使用成本。能夠說README文檔寫得好的開源項目不必定是好的開源項目,可是好的開源項目的README文檔寫得必定好。

下面簡單介紹下README文檔的編寫規範。綜合GitHub上不少大型開源項目的README文檔,我的認爲READEME文檔主要由如下幾部分組成:

1)項目介紹

項目介紹是爲了讓別人快速瞭解項目。主要內容包括項目背景、項目簡介。

2)項目架構

項目架構主要介紹項目的實現方式,可讓用戶更瞭解項目的實現原理。

3)項目集成方式

項目集成方式即項目開發指南,能夠列出項目的部署方式,或者是jar包的使用方式。

4)項目使用指南

項目使用指南也就是告訴用戶怎麼使用項目。最好是附上每一步的使用截圖信息,這樣能減小後期跟用戶之間的溝通成本。

5)版本說明

此處須要告訴用戶使用哪一個版本更穩定。

6)版權說明

版權信息能夠用於做者的維權,保護做者版本信息的合法權益。

7)項目交流方式

項目交流方式部分能夠留下開源做者或者是組織的微信、微博、郵箱等聯繫方式,方便用戶與開源做者進一步技術溝通。

5、版本

GitHub上開源的項目須要有個版本號,版本格式爲:主版本號.次版本號.修訂號,版本號遞增規則以下:

  • 主版本號:當你作了不兼容的 API 修改;
  • 次版本號:當你作了向下兼容的功能性新增;
  • 修訂號:當你作了向下兼容的問題修正。

先行版本號及版本編譯元數據能夠加到「主版本號.次版本號.修訂號」的後面,做爲延伸。

更形象的解釋以下:標準的版本號必須採用 X.Y.Z 的格式,其中 X、Y 和 Z 爲非負的整數,且禁止在數字前方補零。X 是主版本號、Y 是次版本號、而 Z 爲修訂號。每一個元素必須以數值來遞增。例如:1.9.1 -> 1.10.0 -> 1.11.0。

備註:開源版本規範引自GitHub命名規範:語義化版本2.0.0semver.org/lang/zh-CN/

6、開源

作完上述幾步的工做以後,咱們就能夠把項目上傳到GitHub上進行開源了。GitHub的使用網上有不少文章介紹,這裏再也不贅述,能夠參考 在GitHub上參與開源項目平常流程blog.csdn.net/five3/artic…

7、後期

開源後期維護服務是開源項目時最容易被忽視的,爲了讓用戶更好地使用開源項目,咱們能夠經過GitHub issue、微信答疑羣、論壇、社區文章分享等互動形式作好開源後期服務工做。

8、迭代

GitHub上迭代開發流程以下:項目owner給項目開發者設置member權限,member用戶fork開源項目的資源成本身的資源,而後修改fork以後的資源,修改完成以後,提merge請求,只有項目owner纔有權限merge。如何同步fork項目可參見以下文章如何同步fork項目blog.csdn.net/t111t/artic…

開源項目:

微服務任務調度框架 :github.com/siaorg/sia-…

微服務路由網關 :github.com/siaorg/sia-…

做者: 張麗君

來源:宜信技術學院

相關文章
相關標籤/搜索