网上很容易找到各种官方和非官方资料,告诉你这两者的区别(from导出、导入后...方面),定义性的东西不想赘述了。

下面是从官方资料中找到最直接明了的一张图

到底该用managed solution还是unmanaged solution?_managed solution托管方案

但是我始终很迷惑在项目中,到底什么时候该用managed? 什么时候该用unmanaged? unmanaged也很香用起来很自由啊!!

官方的一句说明:

An unmanaged solution is one that is still under development or isn't intended to be distributed. When the unmanaged solution is complete and you want to distribute it, export it and package it as a managed solution.

关于使用managed properties的一句话:

By default, the managed property settings assume that any kind of solution component is fully customizable. Solution developers are encouraged to enable solution components in their solutions to be customizable. 

However, there are situations where the definition of a solution component must be "locked down" to avoid potential breaking changes or to make future maintenance of the solution component easier.


三种做法的影响对比:

managed+uncustomized      限制最严,1.无法再自定义;

managed+customized     有自定义空间,1.可托管包管理;2.可自定义,影响力top level;3.有层的概念可以做版本管理;4.有publisher的限制

unmanaged      自由度最大,但无法做层的版本管理,改了就是改了,立即生效,如果之前有过托管方案在效果将被非托管方案覆盖。

到底该用managed solution还是unmanaged solution?_managed solution托管方案_02


之前项目中的做法:

在开发环境用unmanaged solution 管理每一个功能点开发,把所有涉及修改的component都放项目中,先导出一版unmanaged作为原始版,开发测试完成,再导出一版unmanaged作为发布版。

这样做的好处是,我实现版本管理,我有一整个原始版可以回滚。

缺点是,我要本地保存很多个版本,一旦丢失就无版本可恢复。如果DEV\UAT\PRD环境不一致,那存在自定义被覆盖的风险。

Best practice我觉得是:

在开发环境可用我之前的方式做版本管理,开发前先导出unmanaged做备份。

在发布时导出managed版本,这样可以保证如果UAT、PRD环境有自定义开发,不会被覆盖。

如果要做版本恢复,直接删导入的managed solution即可。

对于那些不想在UAT\PRD环境被人为修改的component就要在导出为managed包前修改为uncustomized的。这点是非托管包做不到的。