【问题标题】:How to bundle run-time-only dependencies from NuGet packages in Inno Setup installer?如何在 Inno Setup 安装程序中捆绑来自 NuGet 包的仅运行时依赖项?
【发布时间】:2017-10-04 10:23:38
【问题描述】:

我正在为具有几个运行时 dll 依赖项的程序创建安装程序。这些依赖项以 NuGet 包的形式提供。我想知道我是否可以以某种方式将 NuGet 包列表指定给 Inno Setup,以便它下载包并将相应的 dll 捆绑到我的安装程序中?

如果这不可能,那么在安装程序中从 NuGet 包中捆绑此类仅运行时的 dll 的预期方法是什么?

【问题讨论】:

  • 您想在编译时还是安装时下载它们? “仅运行时依赖”是什么意思?
  • 创建安装程序时需要下载,以便捆绑。这是在编译我的应用程序之后但在我的安装程序的创建过程中。当执行安装程序来安装我的应用程序时,dll 应该包含在安装程序中,就像我的应用程序的所有其他部分一样。对于仅运行时,我的意思是编译我的应用程序不需要程序集。因此,不需要 nuget 添加/更改程序集引用等。
  • 好的,你能解释一下你的用例吗?我假设您的机器上已经有用于测试的 DLL。那么你到底需要 NuGet 做什么呢?对于自动构建?
  • 我们正在内部迁移到 nuget,这样我们不同的开发团队将在我们内部管理的 nuget 提要中将他们的 sw 作为 nuget 包交付。有时 dll 仅在运行时加载。我们过去使用了一些技巧和脚本将这些 dll 复制到输出文件夹并让 Inno Setup 拾取它们。使用 nuget,我们希望摆脱这些脚本并向 Inno Setup 声明它也应该捆绑的 nuget 包。这似乎是其他人可能也感兴趣的用例:因此 Inno Setup 可能希望得到如此支持。
  • 好的,但是 NuGet 是一个相当复杂的系统。它不仅提供 DLL。您是否只对 DLL(NuGet 包的 lib 文件夹的内容)或其他 NuGet 内容感兴趣?

标签: nuget installation inno-setup


【解决方案1】:

您可以使用Inno Setup preprocessor 运行nuget.exe 下载一个包并根据下载的内容生成[Files] 部分条目。

例如下面定义了NuGetPackage预处理器宏,它收集下载包的lib\net45文件夹中的所有文件:

#pragma parseroption -p-

#define ProcessFile(Source, FindResult, FindHandle) \
    FindResult \
        ? \
            Local[0] = FindGetFileName(FindHandle), \
            Local[1] = Source + "\\" + Local[0], \
            "Source: \"" + Local[1] + "\"; DestDir: \"{app}\"\n" + \
                ProcessFile(Source, FindNext(FindHandle), FindHandle) \
        : \
            ""

#define NuGetPackage(Name) \
    Exec("nuget.exe", "install " + Name, SourcePath, , SW_HIDE), \
    Local[0] = FindFirst(AddBackslash(SourcePath) + Name + "*", faDirectory), \
    Local[0] \
        ? \
            Local[1] = FindGetFileName(Local[0]), \
            Local[2] = AddBackslash(SourcePath) + Local[1], \
            Local[3] = Local[2] + "\\lib\\net45", \
            Local[4] = FindFirst(Local[3] + "\\*", 0), \
            ProcessFile(Local[3], Local[4], Local[4]), \
        : \
            ""

#pragma parseroption -p+

你可以像这样使用它:

[Files]
#emit NuGetPackage("NUnit")
#emit NuGetPackage("EntityFramework")

获得:

[Files]
Source: "C:\source\path\NUnit.3.8.1\lib\net45\nunit.framework.dll"; DestDir: "{app}"
Source: "C:\source\path\NUnit.3.8.1\lib\net45\nunit.framework.xml"; DestDir: "{app}"
Source: "C:\source\path\EntityFramework.6.1.3\lib\net45\EntityFramework.dll"; DestDir: "{app}"
Source: "C:\source\path\EntityFramework.6.1.3\lib\net45\EntityFramework.SqlServer.dll"; DestDir: "{app}"
Source: "C:\source\path\EntityFramework.6.1.3\lib\net45\EntityFramework.SqlServer.xml"; DestDir: "{app}"
Source: "C:\source\path\EntityFramework.6.1.3\lib\net45\EntityFramework.xml"; DestDir: "{app}"

【讨论】:

  • 这看起来是一个很好的解决方案。感谢分享!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多