7

有时出于测试/开发目的,我们会对代码进行一些更改,这些更改必须在生产构建中删除。我想知道是否有一种简单的方法来标记这些块,这样只要它们存在,生产构建就会失败,或者至少它会在构建过程中以某种方式警告你。

简单"//TODO:"并没有真正起作用,因为它经常被遗忘并与大量其他待办事项混合在一起。有什么更强大的吗?

或者,即使我可以创建一些外部 txt 文件并在生产前放置说明,并且蚂蚁会检查该文件是否存在然后取消构建。

我们正在使用 Eclipse/Ant(和 java + Spring)。

更新:我并不是说在本地和生产中存在大量不同的代码。事实上所有的代码都是一样的,应该是一样的。假设我注释掉了一些代码行以在开发过程中节省大量时间,而忘记取消注释它或类似的东西。我只是希望能够以某种方式标记项目需要注意的地方,并且生产构建会失败或显示警告。

4

19 回答 19

13

避免必要性。如果您将代码放入不应该在生产中存在的类中,请弄清楚如何以不同的方式进行操作。例如,提供一个钩子,以便测试代码可以做它需要做的事情,但将测试代码留在类之外。或子类进行测试,或使用依赖注入,或任何其他技术,使您的代码在生产中有效且安全,同时仍可测试。许多此类技术在 Michael Feathers 的精彩著作《有效地使用遗留代码》中有详细记录。

于 2009-06-30T18:46:51.227 回答
12

您也可以只定义更强的任务注释标记:FIXME(高优先级)和 XXX(正常优先级)在 Eclipse 中是标准的,您可以定义更多任务标签(Eclipse Properties -> Java -> Compiler -> Task Tags)

如果你想让你的构建失败,你可以使用 Ant (1.7)包含文件选择器来查找包含指定文本的文件:

<target name="fixmeCheck">
  <fail message="Fixmes found">
    <condition>
      <not>
        <resourcecount count="0">
          <fileset dir="${pom.build.sourceDirectory}"
                   includes="**/*.java">
             <contains text="FIXME" casesensitive="yes"/>
          </fileset>
        </resourcecount>
      </not>
    </condition>
  </fail>
</target>

<target name="compile" depends="fixmeCheck">

显然,切换${pom.build.sourceDirectory}到您的源目录,以及FIXME您想要搜索的评论。

有谁知道在构建文件中打印出在此文件集中找到的文件的好方法(除了再次查看 Eclipse)?

于 2009-06-30T18:59:23.340 回答
7

添加一个单元测试,如果该块存在则失败。也许该块设置了CODE_BLOCK_IS_NOT_DELETED = true;单元测试检查的全局变量。

但是,您更大的问题是您使用不需要或在生产中使用的代码进行测试/开发。这听起来不对。

于 2009-06-30T18:40:01.567 回答
3

一个有点肮脏的建议是使用静态方法创建一个类让我们说

class Prod {
   public static void uction(){
   }
}

然后标记你想要的地方

Prod.uction();

然后在生产之前简单地删除类,你会在需要的地方得到编译器错误:D

于 2009-06-30T18:40:37.883 回答
2

不管你从技术上解决这个问题,我建议你反过来做:不要生产构建做一些特殊的事情,而是以这样一种方式构建你的代码和构建环境,以便在开发构建期间发生魔法。生产版本应尽可能万无一失(或墨菲证明)。

如果开发构建中出现问题:那又如何。

生产构建中的任何问题都会造成更大的伤害。

于 2009-06-30T19:21:36.803 回答
2

[编辑:] 适用于 C++... :-)

使用这些预处理器定义,您的所有问题都将得到解决:

#ifdef _DEBUG
#define COMMENT (code)  /* code */
#else
#define COMMENT (code) #error "Commented out code in release!"
#endif

不确定语法是否完全正确,但你明白了。

于 2009-06-30T19:21:59.737 回答
2

我们添加了一个触发器来阻止\\NOCOMMIT: 你可以有一个\\NODEPLOY:标签,你的构建脚本会在允许构建之前寻找它。

于 2009-06-30T21:17:09.163 回答
1

TDD 和 Dependency Inversion 概念可能会对您有所帮助。通过将不同的代码放入实现接口的类中,您可以控制该代码的测试版本何时运行以及产品版本何时运行。

然后,您有一个文件,明确命名为用于测试,您可以将其排除在构建之外。

于 2009-06-30T18:43:36.473 回答
1

在我从事的项目中,我有各种各样的代码,可以在开发过程中轻松进行测试。我将它们包装在一个检查最终布尔值的 if 块中。当布尔值为真时,可以访问代码。当布尔值为假时,我依​​赖编译器从生成的 .class 文件中删除代码作为优化。例如:

public class Test {
    public static void main(String[] args) {
        final boolean TESTABLE = true;

        if (TESTABLE) {
            // do something
        }
    }
}

通常,我自己管理这些变量,在开发过程中使用它们,并在完成后将 TESTABLE 设置为 false。开发团队可以轻松地同意变量名称的约定,例如 TESTABLE,并且如果任何源文件的 TESTABLE 变量 = true,则构建文件的生产目标可能会检查并失败。

于 2009-06-30T18:53:22.290 回答
1

除了上述所有建议(所有手动废话和向代码中添加杂乱无章的东西是什么?自动化人员......),我注意到您正在使用 Eclipse、Spring 和 ANT。Eclipse 支持多个源文件夹 - 将您的代码分离到“源”和“测试”文件夹中,将任何用于生产的东西放在源文件夹中,并将任何“非生产”的东西放在测试文件夹中。Spring 允许您拥有引用不同实现的多个配置 - 因此您可以拥有仅在生产中引用类的生产配置,以及测试配置以与您的测试代码一起运行。让 ANT 脚本构建您的应用程序的生产和测试版本 - 为进行测试,将“testing”文件夹添加到您的编译路径中,用于生产时将其关闭。

于 2009-06-30T19:08:38.360 回答
0

也许如果您将这些类/方法标记为已弃用,那么它们会在编译期间被标记?

于 2009-06-30T18:38:35.373 回答
0

对于我们的生产环境,我们有几个简单的 C 工具可以使用非常特殊的注释来剥离部分。/*#BEGIN_SKIP*//*#END_SKIP*/。坚持标准 C 运行时,您可以在任何环境中编译。

您可以更改整个构建周期以复制源代码、对其进行转换和编译。

于 2009-06-30T18:41:08.833 回答
0

我会尽量避免这种情况。- 另一种方法是使用依赖注入来注入不同的实现进行测试。

或者...

向对象添加一个 inTest 布尔字段,并将可选代码包装在 if 语句中。

if(inTest) {
testMethod();
}

您可以使用依赖注入设置此 vboolean 或从传入的系统属性中读取它 (-DinTest=true)

希望这可以帮助。

于 2009-06-30T18:44:51.603 回答
0

您可以使用 java 预处理器。对于 j2me 应用程序,我使用天线预处理器。代码看起来像这样

public void someMethod() {
    //#ifdef DEBUG
    doDebugStuff();
    //#endif     
}
于 2009-06-30T18:45:16.660 回答
0

Eclipse 允许除 //TODO 之外的其他标记,例如,您可以添加 //TOBEREMOVED 并为其赋予高优先级,因此它显示在所有其他 TODO 标记之前。

于 2009-06-30T18:49:33.517 回答
0

解决此问题的明显方法是进行单元测试,该测试仅在旨在构建生产文件的构建上运行(或检查当前构建是否针对生产并运行测试,如果是)并失败构建如果测试失败。

你永远不会忘记。就什么样的测试而言,理想情况下它实际上会检查代码所做的任何事情。如果这是不可能的,那么 Terry Lorber 建议的全局静态将比您现在拥有的要好得多。

于 2009-06-30T18:49:42.580 回答
0

只需添加一些 //TODO: -- 然后制作 ac# 脚本(cs-script.net),它会在您的代码中查找 //TODO 并显示它们。然后,您可以将此脚本添加到您的自动构建中(如果您正在这样做),因此每次进行构建时,您都可以看到要执行的操作。在部署之前查看代码的待办事项列表。

除了编写自己的脚本之外,还有一些关于如何将 vstudio 与一些工具集成的说明,这些工具也可以指出你的待办事项:http: //predicatet.blogspot.com/2006/12/show-all-tasks-in-visual -studio-2005-c.html

但是,在我看来,设置该工具比使用正则表达式编写简单的 C# 脚本更痛苦。

于 2009-06-30T18:50:44.807 回答
0

我在“任务视图”中使用 Eclipse 显示的 //FIXME 关键字和 //TODO(您可以过滤要在其上看到的内容)。如果有一些//FIXME,你不应该出去生产:)

于 2009-06-30T19:06:09.160 回答
0

我的解决方案是处理两个单独的代码分支。一个生产分支只获得干净的代码而没有任何调试代码,另一个(有时我什至有几个)用于测试、调试、尝试新的 struff 等。

在 Eclipse 中,这些是单独的项目(或项目组)。

Mercurial 对于这类工作来说是一个不错的 VCS,但 CVS 和 subversion 也很好。

于 2009-06-30T19:16:54.660 回答