如何使用NAnt更改文件中的一行?

6

我需要使用NAnt来更新.js文件中的一行内容。这一行将是类似于:

global.ServerPath = 'http://server-path/';

我需要一种方法来更新该行中“server-path”部分为目标服务器的路径。
ReplaceString不好用,因为我不知道在更新时文件中的路径是什么。
有什么帮助吗?
提前感谢。

你是否考虑过将服务器路径“硬编码”到js文件中是否是解决问题的最佳方案?从客户端JavaScript获取整个URL的值,或者根据实际主机头从服务器端页面发出一小段内联js可能是一些替代方案。 - Damien_The_Unbeliever
是的,不幸的是这是必要的。我们将我们的应用程序作为第三方应用程序中的插件进行托管,JS中的这行代码对于第三方系统找到我们是必需的。 - Nellius
如果string::replace无法工作,<regex>可以完成任务。我需要解决这个问题。请继续关注... - The Chairman
3个回答

12

如果 string::replace 无法正常工作,<regex> 可以胜任。这就是它:

<?xml version="1.0" encoding="utf-8" ?>
<project name="replace.line" default="replace">
  <target name="replace" descripton="replaces a line">
    <property
      name="js.file"
      value="C:\foo.js" />
    <loadfile file="${js.file}" property="js.file.content" />
    <regex
      input="${js.file.content}"
      pattern="(?'BEFORE'.*)global\.ServerPath\s*=\s*'[^']*';(?'AFTER'.*)" />
    <echo
      file="${js.file}"
      message="${BEFORE}global.ServerPath = 'http://bla/';${AFTER}"
      append="false" />
  </target>
</project>

2
我和Aedna遇到了同样的问题。使用(?'BEFORE'[\w\s\W]*)代替(?'BEFORE'.*)(对于AFTER匹配组也是如此)对我有用。我在想这是否与编码有关。 - Gerbus

5

为了能够捕获所有行,AFTER和BEFORE中不应该使用.*,而应该使用[\w\s\W]*。

在我的情况下,.*只能捕获一行,而[\w\s\W]*可以适用于整个文件。


1

还可以使用复制任务与filterchain和替换令牌过滤器

以下是一个示例:

            <token key="WebConfig.EnvironmentName" value="${env_webconfig_EnvironmentName}" />
            <token key="WebConfig.SMTPServerName" value="${env_webconfig_SMTPServerName}" />
            <token key="WebConfig.DatabaseConnectionString" value="${env_drmportal_webconfig_DatabaseConnectionString}" />

        </replacetokens>
    </filterchain>
</copy>

我将所有的模板文件都存储在 /config/ 文件夹中(例如,web.config.template),我的复制任务使用时会在复制到相同的 /config/ 文件夹中替换值,但不包括 ".template" 文件扩展名。然后我会做必要的处理...

我承认,在这种方式中使用属性确实有点繁琐,但是您可以根据环境(例如,本地、暂存、生产等)加载不同的属性值集合,这样您就具有了灵活性,但我认为这可能不是您所要求的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接