我正在为具有几个运行时dll依赖项的程序创建安装程序。这些依赖项以NuGet包的形式提供。我想知道我是否可以以某种方式指定Inno Setup的NuGet包列表,这样它会下载包并在我的安装程序中捆绑相应的dll?
如果无法做到这一点,那么在安装程序中将这样的运行时dll与NuGet包捆绑在一起的目的是什么?
答案 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}"