如何在Inno Setup安装程序中捆绑NuGet包中仅运行时的依赖项?

时间:2017-10-04 10:23:39

标签: nuget installer inno-setup

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

如果无法做到这一点,那么在安装程序中将这样的运行时dll与NuGet包捆绑在一起的目的是什么?

1 个答案:

答案 0 :(得分:3)

您可以使用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}"