【问题标题】:Quick switch between "PROD" and "DEV" modes在“PROD”和“DEV”模式之间快速切换
【发布时间】:2019-07-03 09:55:11
【问题描述】:

我使用一些高级自动化宏开发 VBA 代码,这些宏在 DEV 阶段执行“管道”和额外调试。 但是,当我将文件发送给用户(PROD 阶段)时,我希望将所有这些都关闭。

DEV 和 PROD 之间的切换经常发生(git + devops 方法)。

在 DEV 和 PROD 之间实现快速“切换”的最佳/最优雅的方式是什么? 是的,我可以只使用全局 Const isDebug(我在某些项目中这样做过),但它很繁琐、不优雅且容易出错(我不止一次忘记“翻转”开关——正如我之前所说的那样,快速而敏捷“几乎”CI/CD 管道)。

编辑

现在我正在使用一种快速的脏破解(我不喜欢脏破解)来检查 Excel 文件是否从路径中带有我的登录名的位置运行。如果是 - 这意味着我正在处理文件。如果没有 - 其他人正在使用它,我们不需要任何调试模式。但它很丑陋,而且我可以预见很多问题(例如,明天其他人可能正在开发这些 VBA……因此必须重写调试代码)。

【问题讨论】:

  • 嗨@GSerg,感谢您的链接。这是一个非常有趣的想法……但有点矫枉过正:) 同样,我可能只使用一个名为 isDebug 的简单 Const……但是,正如经验所证明的那样,它太不可靠且容易出错。
  • 这个问题是基于意见的 imo。有很多选项,一个简单的就是GetOption/SetOption在特定的计算机上设置一个调试选项,但是你不能有条件编译。但是,您可以在特定工作站上进行调试,而无需重新编译。
  • 如何使用文本文件作为条件,如果缺少调试,如果存在,请阅读设置调试开/关。如果在没有文件调试的情况下部署不符合标准,并且如果其他人需要调试,请共享文件。
  • @ComputerVersteher,老实说,这是最好的建议 :) UNIX 方式的排序:触摸 .debug :) 如果您将其写在答案中,我会接受它作为解决方案!简单又甜美。当我(自动)复制我的宏时,用户将没有那个 .debug 文件!完全是我想要的!

标签: excel vba ms-access debugging devops


【解决方案1】:

您可以使用工作簿路径中的文本文件作为条件。

如果文件丢失(例如'DebugMode.txt')或未设置调试选项(文本文件中的'DebugMode:On'),请关闭调试模式,否则将其打开。

如果您在没有文本文件的情况下部署工作簿,调试模式将关闭。

如果其他人需要调试模式,请共享/创建文件。

示例代码:

Function IsDebugMode() As Boolean

Const DebugOptionFileName As String = "DebugMode.txt" 
Const DebugIsOnString As String = "DebugMode:On"
Const ForReading as Long = 1

Dim txtStream As Object
Dim DebugOptionFilePath As String

IsDebugMode = False
DebugOptionFilePath = ThisWorkbook.Path & "\" & DebugOptionFileName

With CreateObject("Scripting.Filesystemobject")
    If .FileExists(DebugOptionFilePath) Then
        Set txtStream = .OpenTextFile(DebugOptionFilePath, ForReading, False)
        Do Until txtStream.AtEndOfStream
            If txtStream.ReadLine = DebugIsOnString Then
                IsDebugMode = True
                Exit Do
            End If
        Loop
    End If
End With

End Function

【讨论】:

  • 请注意。请注意,这不是 Mac 安全的。因此,如果您有潜在的 Mac 用户,但只在 Windows 中开发,您可以在 Mac 中将其始终设置为生产模式。因此使用条件编译#If Mac Then'production#Else'your code#End If。 • 如果您也想在 Mac 上开发,那么您将需要 Mac 方式来测试文件,因为 Scripting.Filesystemobject 在 Mac 上不可用。
  • 这是最好的解决方案。完全自动且无忧(当您将 Office 文件复制给用户时,他们将没有 .debug 文件)!如果您忘记添加 .debug 文件,您会在 DEV 阶段很快注意到它(当某些工具停止工作时):)
【解决方案2】:

在 VBE 中转到 Extras -> VBAProject 的属性 并输入编译参数,例如:

DEV_MODE = -1


对不起,德国人的截图。

然后使用下面的代码

Option Explicit

Sub test()
    'the following #If is a compile condition
    #If DEV_MODE Then
        'this is only compiled in dev mode
        Debug.Print "debug mode is on"
    #Else
        'this is only compiled in production mode
        Debug.Print "debug mode is off"
    #End If
End Sub

请注意,在 VBA 中,-1True0False。切换编译参数DEV_MODE = -1将切换整个VBA项目的开发模式。

【讨论】:

  • 这比#const 更容易/更好吗?似乎同样容易,甚至更容易忘记。
  • 谢谢@Pᴇʜ,我不知道那些“Argumente fuer bedingte Kompielierung”:) 可能有用。然而,这并不能真正解决问题 - 就像 Erik A 注意到的那样,它可能比翻转常量更容易忘记......
  • 它实际上与#Const 相同,但比使用Const 更好。 • 当然,您可以像其他解决方法一样忘记更改它;) • 在开发模式下弹出的工作簿打开事件中添加一个大警告,并且您应该有一个 SOP(标准操作程序)来发布某些内容其中包括测试开发模式是否关闭(因此您不会忘记它)。
  • 另一个优点是每个人都知道在哪里寻找那个开关。如果它隐藏在您需要搜索的众多模块之一中。
【解决方案3】:

我不喜欢将开关作为编译器设置的尝试 - 忘记更改它比更改 Const 定义更有可能。

我发现您尝试检查用户名、设备名、文件路径或类似的东西还不错。只需将逻辑放入一个返回boolean 的小函数isTestMode()(即使它是单行)。在这个功能中,如果另一个人将接管工作,很容易改变逻辑。使用此函数(仅此而已!)来检查是否执行您的调试语句。

Public Function isTestMode() as boolean
    ' Checking current user
    isTestMode = (environ("Username") = "FunThomas")
    ' Checking device name
    isTestMode = (environ("ComputerName") = "MySuperPC")
    ' Checking if a specific file is present
    isTestMode = Dir(thisworkbook.Path & "\IsTestMode") <> "")
End Function

【讨论】:

  • 这似乎正是 OP 宣称他们目前正在使用的“肮脏黑客”。
  • 最后一切都是 hack。 Const、Compile Switch、Ini-File、Registry... 我只是想指出你应该有一个地方来检查它,这样就很容易改变逻辑。你不认为重复链接的接受答案不是一个更大的黑客吗?
  • 这也是一个 hack,但它不是 OP已经在使用的 hack
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多