管理SalesForce应用程序开发的最佳实践?

时间:2010-04-01 22:33:07

标签: salesforce package development-environment

我们正在为AppExchange开发应用程序,并正在尝试找出进行开发和发布管理的最佳方法。围绕这个有几个问题:

1)包前缀。我们正在以非托管模式开发代码并以托管方式发布,因此我们必须将所有包前缀添加到代码中。有没有办法在运行时动态执行此操作?现在我们正在使用Ant脚本,这会阻止我们从force.com IDE插件中受益。

2)资源文件......我们正在做一些ajax-ey的东西,因此我们上传了一些不同的资源文件,其中一些是多个文件资源(zip文件)。有没有人使用ANT自动构建这些资源,这样做效果不错吗?

我们的环境看起来非常脆弱,适合一些开发人员,而不是其他人;有其他人有这个问题吗?你是怎么解决的?

2 个答案:

答案 0 :(得分:13)

我不想这么说,但听起来你已经确定了我所知道的最佳方法。 Salesforce打包环境可能是一个难以理解的噩梦。一旦你的托管包有一个前缀,除非你像你一样编写脚本,否则实际上没有回到没有一个的普通包。因此,您将在整个代码中找到包含名称,系统将为您添加。

我发现使用它的最佳方法是保留应用程序的“纯”版本,它将从Ant内部干净地安装到dev组织中。一旦在Ant中获得代码,就可以将其添加到“普通”源代码控制中。看起来Salesforce中没有太多大型应用程序与多个团队成员构建,因为据我所知,对包含源代码控制的工作流程的支持不多。他们尝试将某种类型的发布管理添加到dev org配置中,该配置现在处于测试阶段,但它看起来并不好。

我认为Ant使用Salesforce Force.com迁移工具是大部分时间。然而,一旦你想要创建一个托管软件包,你就会被冻结的代码库所困扰,并使用该前缀,然后你必须从包装系统中进行打包发布(来自beta等)本身。最好的方法是刷新沙箱(每月一次的硬限制!!),然后让开发人员退出该沙箱并部署到单个开发组织中,然后可以定期合并到“组开发组织”中,之后部署回Sandbox(使用Force.com IDE或Ant),然后再部署到Production。

整个过程基本上是一场彻底的灾难。 Salesforce非常接近拥有一个超级强大的平台,但很多时候感觉就像一辆没有方向盘的超级跑车。

就静态资源而言,您应该能够使用Eclipse以相对简单的方式自动执行这些资源,以便您可以在一个步骤中单独部署它们。 API也应该支持它。

我已经研究过一些相当大的Apex代码库(我认为,希望),而且我真的没有明显优雅的解决方案。在某些情况下,你会遇到使用Ant部署的奇怪组合,Eclipse其他等等。

来自其他开发环境,它经常令人困惑,而且很奇怪。例如,令人困惑的是,您无法在一步中轻松转储数据库,同时跟踪对象之间的关系,然后一步将其“导入”另一个组织。我们实际上必须编写一个工具,可以在浏览对象关系,加载所有数据,递归删除数据等时轻松提取所有数据,因为我们需要一种简单的方法来测试orgs。

顺便说一句,dev orgs基本上是扔掉了orgs。我们为不同的测试目的创建了数十个,并保留不同的版本和配置。

抱歉,我无法给你更好的消息。在这里可能会有更多的大师可以指出一种优雅的方式来管理包装,我会对你的回答感兴趣!如果你想要同情,你可以发送电子邮件至suprasphere --- at --- gmail! :)

答案 1 :(得分:0)

我们最近切换到使用前缀管理器而不是进行蚂蚁替换。

这是我们的代码。

public class PrefixMgr {
    private static string objPrefix = null;

    public static string getObjPrefix() {
        if(objPrefix == null) {
            try {
                Database.query( 'select MyColumn__c from my_prefix__MySmallTable__c' );
                objPrefix = 'my_prefix__';
            }
            catch(Exception e) {
                objPrefix = '';
            }
        }

        return objPrefix;
    }

    public static string getAppPrefix() {
        return 'my_prefix__';
    }

    public static string getObjName(string inp) {
        return getObjPrefix() + inp;
    }
}   

基本上,这会尝试对具有前缀名称的表进行查询(一次)。如果它不存在,那么我们处于非托管模式,没有包前缀。如果确实成功,那么我们会适当地设置前缀。 getObjName是一种方便,因为PrefixMgr.getObjName('MyObject__c')PrefixMgr.getObjPrefix() + 'MyObject__c'更容易阅读(特别是在字符串连接中)。

对想法和评论感兴趣。