无法从MSBuild引用Nuget程序包的“工具”文件夹中的可执行文件

wwa*_*rby 4 c# msbuild visual-studio nuget nuget-package

我有一个C#控制台应用程序项目,我正在尝试将其转换为Nuget包,以便团队中的多个项目可以在.csproj文件中的AfterResolveReferences步骤中从该项目中调用可执行文件。

我已经用一个看起来像这样的.nuspec文件创建了Nuget包:

<package ...>
  <metadata>
    ...
  </metadata>
  <files>
    <file src="bin\Release\*.*" target="tools" />
  </files>
</package>
Run Code Online (Sandbox Code Playgroud)

这可以工作并创建一个Nuget程序包,该程序包在“工具”目录中包含我的可执行文件。问题是包含文件夹中包含Nuget软件包的版本号,该版本号会经常更改。我试图在.csproj文件中像这样引用它:

<Target Name="AfterResolveReferences">
  <Exec Command="$(SolutionDir)packages\PackageName.1.2.3\tools\AssemblyName.exe" />
</Target>
Run Code Online (Sandbox Code Playgroud)

当我在路径中包含PackageName.1.2.3时,它可以按预期工作,但这显然是一个非常脆弱的解决方案。当我仅使用“ AssemblyName.exe”时,我得到“命令AssemblyName.exe退出,代码为9009”。

做这种事情显然有一个简单的标准,我不熟悉-MSBuild和Nuget并不是我最擅长的,所以我非常感谢任何建议。

我实际上在这里想要实现的是使用TypeLite.Lib包创建一个TypeScript文件,其中包含从我的模型项目中定义的C#类派生的接口。TypeScript文件必须在构建Web项目之前创建,因为Web项目中的TypeScript代码取决于此输出中包含的接口。我愿意提出更优雅的方法来解决此问题,但我仍然想知道如何解决引用问题。

Mar*_*ich 6

这个想法是NuGet软件包应该是独立的。也就是说,使用nuget包时,用户无需向项目文件添加任何内容。

NuGet软件包还可以包含构建逻辑-如果将PackageName.targets文件放在build目录中,则该文件将自动包含在引用NuGet软件包的项目中。在这里,您可以定义目标,通常可以使用来引用工具$(MSBuildThisFileDirectory)..\tools\MyTool.exe

这一点很重要,因为该packages目录仅用于“经典” NuGet引用packages.config,而不用于PackageReference引用NuGet包的新型方式,在该方式中,所有项目/解决方案均共享用户级别的全局包缓存(不包含解决方案本地副本)。