如何在 Fake.Deploy 部署脚本中引用 FakeLib.dll?

How can I reference FakeLib.dll in a Fake.Deploy deployment script?

我试图在我的部署脚本中从本地 Fake.Deploy 安装引用 FakeLib.dll,但似乎无法找到正确的使用路径。我发现 Environment.CurrentDirectory 指向我的 Fake.Deploy 安装,但只是使用

#r @"FakeLib.dll"

无效:

Deploy messages
{
  2015-05-12 09::22:50.413
  2015-05-12 09::22:50.417
  2015-05-12 09::22:50.417 Install.fsx(2,1): error FS0082: Could not resolve this reference. Could not locate the assembly "FakeLib.dll". Check to make sure the assembly exists on disk. If this reference is required by your code, you may get compilation errors. (Code=MSB3245)
  2015-05-12 09::22:50.432
  2015-05-12 09::22:50.432
  2015-05-12 09::22:50.433 Install.fsx(2,1): error FS0084: Assembly reference 'FakeLib.dll' was not found or is invalid
}

我在网上找到的示例建议将 FAKE 与我的应用程序一起部署在 NuGet 包中并像这样引用它:

#r @"tools\FAKE\tools\FakeLib.dll"

但这似乎有点矫枉过正和不必要的参考。

有谁知道引用本地 Fake.Deploy 安装的路径是什么?

自己刚找到答案:post-deployment fsx脚本中引用的base directory是__SOURCE_DIRECTORY__,deployment的目录本身。

因此假设您的 Fake.Deploy 安装在

 .\Fake.Deploy\

那么Environment.CurrentDirectory会指向这个目录,而__SOURCE_DIRECTORY__会指向

.\Fake.Deploy\deployments\{your_app}\active

因此您可以从 post-部署 fs​​x 脚本中引用 FakeLib.dll,如下所示:

 #r @"..\..\..\FakeLib.dll"

我会尝试将此添加到 documentation page

话虽这么说,但实际上要将 FAKE 与您的应用程序一起部署需要注意以下几点:

  • 它确保运行您的部署脚本使用正确的版本
  • Fake.Deploy 安装可能不在您的控制之下,因此您可能无法通过权限访问其二进制文件
  • Fake.Deploy 的配置允许指定不同的部署位置(通过 "WorkDirectory"),因此当使用非默认位置时此硬编码路径将中断

请注意,当您的 NuGet 包通过 Fake.Deploy 发送时,代理会从与假可执行文件相同的文件夹运行包根目录中的脚本。因此,当您的 fake.exe 在 C:\Fake\tools\fake.exe 中时,您的文件在 C:\Fake\tools\deployments\YourApplication\active 中。如果您需要从该目录读取属性文件或其他内容,您的脚本将看不到它。因此,您需要在脚本中执行以下操作:

open System
open System.IO
let arguments = System.Environment.GetCommandLineArgs()
let script = arguments.[1]
let scriptDirectory = script.Replace(@"\NameOfMyDeployScript.fsx", @"")
System.IO.Directory.SetCurrentDirectory(scriptDirectory)

我想把它放在那里,这样就不会有人因为试图访问某个文件而失去理智。如果您不更改目录,您将看到这样的错误:

System.IO.FileNotFoundException: Could not find file 'C:\Fake\tools\myfile.properties'