我正在使用命令行工具开发Console .Net471项目(csproj)。
.csproj具有相应的行:
<IsTool>true</IsTool>
<PackAsTool>true</PackAsTool>
nuget软件包安装在以下位置:
<solution>/packages/<idpackage>/tools
因此,它不能作为任何解决方案项目下的命令行工具使用。
我希望将软件包输出重定向到%userprofile%/.nuget/tools/
或类似位置,以使工具具有固定的位置。
但是我找不到任何有关MSBUILD 15.0+安装工具或重定向安装路径的文档。
答案 0 :(得分:1)
以NuGet软件包形式提供的命令行工具无需安装在固定位置。
实际上,有一个简单的方法,所以我以Obfuscar为例。
准备道具文件,
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);
}
}
});
在您的包装中使用此道具文件,
<?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和更低版本,无法使用IsTool
或PackAsTool
。从根本上讲,存在三种主要的包装nuget封装“世界”:
PackageReference
support instead of packages.config
and MSBuild 15.1+ first-class support for NuGet pack
and restore
as well-known MSBuild targets)。在简单的情况下,*.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
这覆盖了包装应用相当大的表面积。请注意,COM的缺失也解释了WiX为何是非常落后的技术的原因:WiX主要是通过*.wixproj
将MsiExec集成到C#项目中的一种方式,而MsiExec 是 COM是在幕后:每个MsiExec软件包及其元数据都存储在Windows注册表中与COM相关的文件夹下。
有关其外观的真实示例,您可以查看我们的项目FluentMigrator
。值得注意的是,先看FluentMigrator.Console.csproj
和FluentMigrator.Console.nuspec
,然后看我们如何构建整个解决方案,然后为FluentMigrator.Console.csproj
做一个特殊的打包/发布步骤。我正在研究简化此方法的方法,但目前可能对您来说是合适的灵感。
此外,您可能希望查看开源项目MSBuild.Sdk.Extras