24

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

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

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

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

4

2 回答 2

13

我不想这么说,但听起来你已经确定了我所知道的最好的方法。使用 Salesforce 打包环境简直就是一场噩梦。一旦您的受管软件包有了前缀,就真的无法回到没有前缀的普通软件包,除非您像以前那样编写脚本。所以你会发现包名遍布你的代码,系统会为你添加。

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

我认为 Ant 使用 Salesforce Force.com 迁移工具是大多数情况下要走的路。然后,然而,一旦你想创建一个托管包,你就会被冻结的代码库困在这个前缀上,然后你必须在打包系统中进行打包发布(来自 beta 等)本身。最好的方法是刷新沙箱(每月一次的硬限制!!),然后让开发人员退出该沙箱并部署到单独的开发组织中,然后可以定期合并到“组开发组织”中,之前部署回沙箱(使用 Force.com IDE 或 Ant),然后部署到生产环境。

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

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

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

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

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

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

于 2010-04-22T07:59:37.220 回答
0

我们最近切换到使用前缀管理器而不是进行 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__c')它比PrefixMgr.getObjPrefix() + 'MyObject__c'.

对想法和评论感兴趣。

于 2010-05-25T05:47:09.950 回答