如何创建在固定位置安装可执行文件的Nuget Tools软件包

时间:2018-06-27 18:03:31

标签: c# msbuild nuget csproj

我正在使用命令行工具开发Console .Net471项目(csproj)。

.csproj具有相应的行:

<IsTool>true</IsTool>
<PackAsTool>true</PackAsTool>

nuget软件包安装在以下位置:

<solution>/packages/<idpackage>/tools

因此,它不能作为任何解决方案项目下的命令行工具使用。

我希望将软件包输出重定向到%userprofile%/.nuget/tools/或类似位置,以使工具具有固定的位置。

但是我找不到任何有关MSBUILD 15.0+安装工具或重定向安装路径的文档。

2 个答案:

答案 0 :(得分:1)

以NuGet软件包形式提供的命令行工具无需安装在固定位置。

实际上,有一个简单的方法,所以我以Obfuscar为例。

步骤1

准备道具文件,

 inputEl.addEventListener("input", async e => {
        if (e.target.value !== "") {
          const url = endpoint + e.target.value;
          const result = await cachedFetch(url, { signal })
            .then(async response => ({ ok: true, data: await response.json() }))
            .catch(error => Promise.resolve({ ok: false, error }));
          if (result.ok) {
            resultContainer.innerHTML = result.name;
          } else {
            errorHandler(result.error);
          }
        }
      });

第2步

在您的包装中使用此道具文件,

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <Obfuscar>$(MSBuildThisFileDirectory)..\tools\obfuscar.console.exe</Obfuscar>
  </PropertyGroup>
</Project> 

现在您完成了。

此NuGet程序包的所有使用者仅需使用 <files> <file src="bin\release\obfuscar.console.exe" target="tools" /> <file src="build\obfuscar.props" target="build" /> </files> </package> 来引用该控制台应用程序(无论实际的物理路径如何)。

答案 1 :(得分:0)

对于.NET Framework 4.8和更低版本,无法使用IsToolPackAsTool。从根本上讲,存在三种主要的包装nuget封装“世界”:

  1. *。csproj使用.NET Core SDK项目格式(带有NuGet 4.0+ PackageReference support instead of packages.config and MSBuild 15.1+ first-class support for NuGet pack and restore as well-known MSBuild targets)。
  2. *。csproj使用旧版.NET Framework SDK项目格式
  3. *。csproj使用旧版.NET Framework ToolsVersion项目格式

在简单的情况下,*.csproj using Legacy .NET Framework SDK project format有效。但是,使用此组合有很多事情无法完成。这是我尝试分解的尝试:

|                      |                       | ------------------ Cross-Section of MSBuild Features  ------------------ |
|                      |                       |          |                  |                    |              |        |
| MSBuild Project Type | .NET Runtime          | CLI Tool | PackageReference | FrameworkReference | COMReference | WiX    |
| -------------------- | --------------------- | -------- | ---------------- | ------------------ | ------------ | ------ |
| ToolsVersion         | Legacy .NET Framework | No       | No               | No                 | Yes*         | Yes**  |
| .NET SDK             | Legacy .NET Framework | No       | Yes              | No                 | No***        | No     |
| .NET SDK             | .NET Core             | Yes****  | Yes              | .NET Core 3.0+     | No***        | No     |

1 * MSBuild首席开发人员Rainer Sigwald说:“ COMReference不能正常工作” https://github.com/dotnet/installer/issues/1690#issuecomment-485913274
2 ** WiX要求使用旧的ToolsVersion项目引用,以便通过计算需要交付的所有依赖项为您正确构建WiX项目。
3 *** 特别是,您不应该期望.NET Core支持COM,因为Jan Kotas引用了Mono Runtime团队在支持COM方面的经验发表了评论。特别是,Linux不支持Windows结构化异常处理,因为Linux的基本应用程序二进制接口是C。有关更多信息,请参见以下示例,说明为什么.NET Core不能支持COM不稳定:https://monoinfinito.wordpress.com/series/exception-handling-in-c/
4 **** .NET Core在.NET Core 2.1 SDK

中引入了CLI工具

这覆盖了包装应用相当大的表面积。请注意,COM的缺失也解释了WiX为何是非常落后的技术的原因:WiX主要是通过*.wixproj将MsiExec集成到C#项目中的一种方式,而MsiExec COM是在幕后:每个MsiExec软件包及其元数据都存储在Windows注册表中与COM相关的文件夹下。

现在,这种不可能的后果是什么?

  1. 您不能使用.NET Core 3.0工具清单文件来描述此类工具。
  2. 您需要在“发布者”端(“工具”)和“消费者”端(使用该工具的客户端)上编写额外的管道代码。

有关其外观的真实示例,您可以查看我们的项目FluentMigrator。值得注意的是,先看FluentMigrator.Console.csprojFluentMigrator.Console.nuspec,然后看我们如何构建整个解决方案,然后为FluentMigrator.Console.csproj做一个特殊的打包/发布步骤。我正在研究简化此方法的方法,但目前可能对您来说是合适的灵感。

还有什么需要考虑的吗?

此外,您可能希望查看开源项目MSBuild.Sdk.Extras