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

托管SalesForce应用程序开发的最佳实践?,salesforce,package,development-environment,Salesforce,Package,Development Environment,我们正在为AppExchange开发应用程序,并试图找出进行开发和发布管理的最佳方法。围绕这一点,有几个问题: 1) 包前缀。我们在非托管模式下开发代码,并以托管模式发布,因此我们必须将所有包前缀添加到代码中。有没有一种方法可以在运行时动态执行此操作?现在我们正在使用一个Ant脚本,它阻止我们从force.com IDE插件中获益 2) 资源文件。。。我们正在做一些AJAXEY的工作,因此我们上传了一些不同的资源文件,其中一些是多文件资源(zip文件)。有没有人使用ANT自动化了这些资源的构建,

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

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

2) 资源文件。。。我们正在做一些AJAXEY的工作,因此我们上传了一些不同的资源文件,其中一些是多文件资源(zip文件)。有没有人使用ANT自动化了这些资源的构建,这是否有效


我们的环境似乎非常脆弱,对某些开发人员有效,而对其他开发人员无效;其他人有这个问题吗?你是怎么解决的?

我不想这么说,但听起来你已经确定了我所知道的最好的方法。Salesforce打包环境可能是一场彻头彻尾的噩梦。一旦托管包有了前缀,就真的无法返回没有前缀的普通包,除非您像编写脚本一样编写它。因此,您将在代码中找到程序包名称,系统将为您添加程序包名称

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

我认为Ant使用Salesforce.com迁移工具在很大程度上是可行的。然而,一旦你想制作一个托管包,你就会被冻结的代码库卡住了,前缀是,你必须在打包系统内部进行打包发布(从beta版开始,等等)。最好的方法是刷新到沙盒(硬限制为每月一次!!),然后让开发人员从沙盒中取出并部署到各个开发组织中,然后定期将其合并到“组开发组织”中,然后再部署回沙盒(使用Force.com IDE或Ant),然后部署到生产中

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

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

我已经研究过一些相当大的Apex代码库(我想,也希望如此),但恐怕没有明显的优雅解决方案。在某些情况下,您将不得不使用Ant、Eclipse等奇怪的部署组合

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

顺便说一句,开发组织基本上是一次性组织。我们为不同的测试目的创建了几十个,并保留了不同的版本和配置


对不起,我不能告诉你更好的消息。这里可能有更多的大师可以指出一种优雅的方式来管理包装,我会和答案一样对你感兴趣!如果你想表达你的同情,你可以发电子邮件给我,地址是supersphere---at---gmail:)

我们最近改用前缀管理器,而不是进行ant替换

这是我们的代码

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_u__c')
PrefixMgr.getObjPrefix()+'MyObject_u_c'
更容易阅读(尤其是在字符串concat中)


对想法和评论感兴趣。

为什么需要在查询中添加前缀?只有包外引用包内对象/类的代码才需要使用命名空间。看,原来我们不需要这样做,结果我们没有使用这个。我们收到了一些错误的信息,花了一段时间才弄清楚:)。也许值得看看如何使用变更集来解决这个问题。它们是Salesforce.com最近新增的一款产品。我认为当给出这个答案时,它们是不可用的。变更集不能在开发者组织中使用(您创建AppExchange应用程序的地方),所以在这种情况下没有帮助。