本文来自微软开源.NET 的一篇公告 ,文中阐述了微软为何选择在 Github 开源.NET,以及微软对开源和开源社区方面的认识的变迁。

对于.NET来说,今天(2014/11/12)是个大日子! 我们很高兴宣布.NET核心将要开源,包括运行时环境和框架类库。

这是我们为开源努力的自然结果,我们已经开源了主要的编译器(C#,VB、F#),还有ASP.NET:

我们通过将范围扩展到.NET运行时环境和核心框架,使(微软开源进程)进入下一个阶段。

什么是 .Net 核心?

.Net 核心是一个模块化的开发栈。该开发栈包含 .Net 平台的所有特性。这些特性已经被用在 ASPNET Core 5 和 NET Native。下面会详细介绍什么是 .Net 核心以及它和 NET Framework 的关系。

为什么我们要开源 .Net 核心?

我们开源 .Net 核心有下面两个原因:

  1. 为跨平台的 .Net 奠定基础

  2. 建立一个强大的生态系统

下面让我们来关注更多细节。

为跨平台 .Net 奠定基础

作为一个 .Net 开发者,你以后可以在 Linux、 MacOS、 iOs 和 Android 上构建或者运行你的程序,而不仅仅是 Windows。

这有一个挑战就是,windows已经有一套代码实现,同时 Mono 也有一套代码实现。Mono 社区事实上被强迫重新实现了一次 .Net,因为没有开源的代码实现。当然该代码实现可以通过 Rotor 来让变得可用。但是没有我们的开源授权,让这件事变得不可能。客户已经提出了很多的问题,但是这些问题很难去修复,因为双方都不可以看到对方的代码。这也导致了很多重复的工作,而且实际上这些工作不是针对特定于平台而导致的。immutable collections就是一个很明显的例子。

建立一个扩平台的技术栈的最好方法,就是通过合作的方式去建立唯一的技术栈。同时最好的合作方式就是去把它开源。

建立并利用一个强大的生态系统

我的团队使用NuGet(.NET平台下一个开源项目)实现更敏捷的开发周期已近两年了。 为了让客户提供反馈,我们早期进行了发布,现在我们已取得了巨大的成功。

如果你仔细思考会发现: 开源本质上是敏捷开发模式。 每一个改动都需要立刻发布,并且(在理论上)可用。 我团队里的很多成员是Twitter和Stack Overflow会员,他们热衷于客户讨论。 不止一次,我希望我能够给客户介绍内部文档,并向他们解释我们的系统是如何实现的。 或者只是简单地介绍一个问题是如何被解决的。

对于我们来说,开源架构也意味着我们可以实时与客户进行交流。 当然,并不是每一个客户都想我们紧密互动。 但是确实有一些人使得架构变得更好,因为他们提供了早期、稳定的反馈。

我把这比作驾驶一辆汽车: 频繁的小幅度的调整方向盘比大幅度的调整更有效,且风险更低。

选择利用 GitHub

我们决定在 Github 上存放 .Net 核心的代码,因为据 Phil Haack 说在 Githut 上发布代码,可以帮助提高效果:

这当然是开玩笑。

作为一个原则,我们不想告诉社区我们在哪里。相反,我们应该去到社区它本身就存在的地方。根据其他的一些项目反馈来看,Github是 .Net 的最主要社区。

不相信?我原来也怀疑所以我做了个小实验。我将自己的一个开源项目从CodePlex上移到了GitHub上。在CodePlex上两年了我只有一个pull request,而移到GitHub上五天后我的pull request就达到了三个,而且发现了另外两个贡献者。这是三个月前了,总共从那时起我已经获得了16个pull request,许多都有实质性的进展。(顺便说一句:最开始的那一个被加进了很多单元测试,很酷有木有?)尽管这个还不算是严格意义上的案例,但确实能让我们听到更多客户的需求。

所以为了加入社区,我们决定将 .NET Core 发布在GitHub上,一个月前,在GitHub上已经能看到我们的成果了(our samples available on GitHub)。

开源的开发经历

我的团队也开源过,比如MEF项目,但平心而论,那个并没取得多少收获。我们认为基本的原因是缺少社区的参与。当我们只开放了源码后,并没有努力为之建立一个社区。我深深感到,建立一个社区才是开源项目成功的关键所在。而建立一个社区的关键是开发的过程也要开源地进行。

为不辜负期望,我们同样也会透明我们的开发计划是什么,我们要克服的有那些挑战,以及哪些范围还未完成。我来解释一下这些。

第一步是要停止code bombs,就像之前MEF中投的那些一样。代码炸弹本质上是不定期的公开更新的源代码,它们是系统项目组内部正在完成的代码。由于各种原因,这样做是有问题的。举个例子,公布的时间延迟,大家很难看到同一份代码,这样就很难进行公开的讨论。另一个大问题是历史版本丢失,自动同步让我们同步一致代码,但感觉像reinventing Git.

所以为防止代码炸弹,我们建立我们的开发环境在公开的GitHub 仓库,它是一个领先的系统。这意味着所有的代码修改会立即表现出来。但我们不会:

  • Code reviews.  我们希望所有的代码审查过程全公开,通过 GitHub’s pull request model.

  • 设计文档及讨论,我们同样共享设计时的备注、规格以及实现的文档。我们一定会讲清楚我们将用什么格式。至少让你可以记下基本文档,就像 Mad’s C# design notes的一样。另一个想法是,我们给我们的设计讨论会录音,然后共享到 Channel 9。我们一定会讲清楚,我们会以什么样的节奏去,怎么实现它。

我们初步计划使用GitHub问题清单功能来跟踪bug。 巧妙的是我们也提供了其它途径,如 UserVoice论坛,微软Connect网站和我们内部的团队协作服务器(Team Foundation Server)。 它们的介绍如下:

  • User Voice论坛。 在潜在昂贵项目排名方面,UserVoice有优秀的投票系统。 因此,对于更大特性和根本创新,UserVoice是搜集反馈的最佳选择。

  • 微软Connect网站。 Connect网站主要用户是企业用户和产品支持人员。 我们将有可能继续使用这个网站用于产品支持,但是不推荐你使用(它来提交bug),除非是提交.NET核心的bug。

  • 内部团队协作服务器。 我们不再使用TF Version Control工具来管理.NET核心,但是仍然管理大块的DevDiv模块。 为了能够跨平台的协作工作,我们会继续允许团队通过TFS提交bug。 我们正在考虑如何公开那些bug。 一个方法是创建一个自动镜像系统。

在UserVoice和Connect网站上,当我们的团队成员在GitHub上提交了相应的问题后,你可以看到一个关闭UserVoice/Connect上问题的流程。

我们接受贡献

是的,我们接受贡献!不过,与任何开源项目一样,我们不会盲目的接受所有的贡献。我们所收到的所有pull请求都会按照下面的标准进行评判:

  • 路线图(Roadmap)。所有项目都专注在某些领域。为了保持重心和发展势头,大部分工作向项目路线图看齐是很重要的。

  • 质量(Quality。我们要为输送高质量代码负责。因此,外部人员必须满足与微软员工相同的质量标准。包括正确的设计、架构、足够的测试覆盖率和遵守编码风格。

我们相信通过为外部开发者提供足够的环境,在开源界的开发将会成功。例如,你可以看到我们的代码审查并且阅读内部是如何设计的相关文档。我们将会公布路线图。

贡献者最好提早与我们沟通你的想法。这样的话,我们就可以给你提供一些帮助,比如提供文档或者是针对你的方案进行讨论。我们也会把我们希望大家做的工作发布在GitHub的issues列表上,供大家进行选择。

通常,所有的社区贡献都要通过GitHub的 pull request模型来完成,也就是说,你首先要fork我们的项目,并在你的分支上进行开发,最后通过pull request将代码提交到主干上。 对代码检视也同样是使用这一模型。

在我们合入你的贡献之前,你还需要签署一份 Contributor License Agreement (CLA)协定。我们目前正在把这个工作工具化,最后的效果可能和Azure CLA过程类似。

构造并运行你自己的分支

要玩玩我们的程序或实验你自己做的更改,你需要构建并运行你自己的库版本。我们想要做的尽可能的简单,所以看这里:

  • 克隆我们得仓库(git clone https://github.com/dotnet/corefx)

  • 调用build.cmd

只需要Visual Studio 2013用来构建(不用“Dev14”)。将会构建所有得库并运行单元测试。

过去我们我们做的一个更改是强命名,以防止你草率的删除已存项目的二进制文件。通过提供强命名二进制文件的新方法我们已经解决了这个隐忧,我们把新方法叫做开源签名。你可以在我们的开发者指南中找到更多信息。

.NET基金会

.NET核心项目是由.NET基金会来进行管理。他将成为推动.NET核心栈不断向前的关键力量。我们还会与Xamarin/Mono项目的Miguel de Icaza进行紧密的合作,来创建一个共享的代码基线,使其发展为一个跨平台实现的.NET核心栈。

今天,只有部分代码库可以在GitHub上访问到:

我们会以下几个领域持续发力:

  • 更多的代码库. 目前开源的部分,可以理解为整个项目的首付款。我们的目标是在2015年开源整个.NET核心栈。

  • 构建和运行在非Windows平台. 我们现在只提供了在Windows上进行构建和运行的能力。我们正计划与Mono社区一起组件一个公开的工作组来完成此项工作。

  • .NET 核心运行时环境 (CoreCLR). 我们正在拟定运行时环境的开源计划。请保持关注。

总结

.NET核心栈将在GitHub上完全开放源代码。我们已经对其中的一些库做了一些必须要进行的工程性更改,并在核心框架代码仓库中包含了它们。从现在到生成2015 构建期间,你将看到我们在开放源代码方面所做的工作。欢迎下载源代码!

请多多使用.NET基金会的论坛,让我们知道你们所想!

微软为何选择在 Github 上开源 .NET 核心?的更多相关文章

  1. OData.NET已在 GitHub上开源

    OData.NET已在 GitHub上开源 微软最近已将OData .NET所有类库的源代码全部发布在GitHub上. 以下与OData相关的项目目前都已迁移到GitHub上: ODataLib Ed ...

  2. 参与github上开源项目的大致流程和注意事项

    Foreword github是一个很火的代码托管服务网站,可能好多人都想参与一两个项目玩一玩学习一下,但由于是纯英文的网站,可能又会止步于想法上没有动手实践.接下来我就介绍一下参与github上开源 ...

  3. 如何优雅的阅读 GitHub 上开源 js 框架和库的源码

    如何优雅的阅读 GitHub 上开源 js 框架和库的源码 step 先总后分,即先了解一下啊框架的大体架构,又一个全局的认识,在选择某些和感兴趣的部分,仔细阅读,各个击破: 带着问题阅读,用到了什么 ...

  4. 分布式版本库——Windows下Git的环境部署以及在GitHub上开源自己的项目

    分布式版本库--Windows下Git的环境部署以及在GitHub上开源自己的项目 这几天着实忙的焦头烂额,可惜不是搞技术,今天周日,难得闲下来,写篇大家都想学习的Git教程,其实廖雪峰老师的网站已经 ...

  5. 【转载】【技巧总结】PyCharm怎么克隆github上开源的项目

    PyCharm怎么clone github上开源的项目 一.先要确保PyCharm正确的配置了Git   如果你已经在PyCharm中配置好了Git,可以跳过此步骤,直接看下一步.   那么怎么在Py ...

  6. GitHub上开源的YOLOv5

    GitHub上开源的YOLOv5 代码地址:https://github.com/ultralytics/YOLOv5 该存储库代表Ultralytics对未来的对象检测方法的开源研究,并结合了我们在 ...

  7. Android github上开源项目、酷炫的交互动画和视觉效果地址集合

    Android上开源的酷炫的交互动画和视觉效果:http://blog.csdn.net/u013278099/article/details/50323689 Awesome-android-ui: ...

  8. 快讯 | FireEye在GitHub上开源密码破解工具GoCrack

    近日,FireEye 开源了一款密码破解工具 GoCrack,可在多机器上部署破解任务. GoCrack 是由 FireEye’s Innovation and Custom Engineering ...

  9. 仿花田:相亲网站 意中人 已在GitHub上开源

    在园友的强烈呼唤下,我还是负责任的分享给大家,因为对代码比较熟悉一下,还是有些问题要说明,不然别人看起来会比较费劲.说实话除了这个bootstrap的界面风格和这件事情本身对大家有吸引力之外,内部的逻 ...

随机推荐

  1. Route Between Two Nodes in Graph

    Given a directed graph, design an algorithm to find out whether there is a route between two nodes. ...

  2. springcloud常见问题处理

    无法在任何已知服务器上执行请求. 原因是注册中心未启动.在使用springcloud搭建微服务时,一定要先启动注册中心,再启动服务端和客户端.具体报错如下: com.netflix.discovery ...

  3. 配置Eclipse编写HTML/JS/CSS/JSP页面的自动提示

    我们平时用eclipse开发jsp页面时智能提示效果不太理想,今天用了两个小时发现了eclipse也可以像Visual Studio 2008那样完全智能提示HTML/JS/CSS代码,使用eclip ...

  4. MCM/ICM2018美国大学生数学建模大赛D题翻译

    MCM/ICM2018美国大学生数学建模大赛D题翻译 2018年ICM问题D: 非使用汽油并在使用电力行驶的汽车(电量非空的) 由于环境和经济的原因,全球都在减少使用化石燃料,包括汽车汽油. 无论是受 ...

  5. Java学习--编译器javac

    Java的源程序为.java文件, 编译后生成.class文件(字节码文件); javac(java compiler的简写)是java语言的编译器. Hello.java public class ...

  6. 在局域网内实现https安全访问

    在局域网内实现https安全访问 准备原料 服务器 resin (当然也可以是tomcat,这里以resin为例) 安装jdk 域名 (随便写一个就行,因为是内网使用,不会被校验) 生成证书 第一步: ...

  7. Linux系统产生随机数/dev/random 和 /dev/urandom

    1.  基本介绍 /dev/random和/dev/urandom是Linux系统中提供的随机伪设备,这两个设备的任务,是提供永不为空的随机字节数据流.很多解密程序与安全应用程序(如SSH Keys, ...

  8. (四)Dubbo Admin管理控制台

    Dubbo Admin管理控制台 在dubbo2.6.0往后的版本在dubbo发布包中就没有dubbo-admin了,而是在incubator-dubbo-ops(https://github.com ...

  9. ArduinoYun教程之ArduinoYun硬件介绍

    ArduinoYun教程之ArduinoYun硬件介绍 ArduinoYun的电源插座 Arduino Yun有两排插座,这些插座可以按类型分为三类:电源.数字IO和模拟输入.电源部分主要集中在如图1 ...

  10. NOI.AC NOIP模拟赛 第二场 补记

    NOI.AC NOIP模拟赛 第二场 补记 palindrome 题目大意: 同[CEOI2017]Palindromic Partitions string 同[TC11326]Impossible ...