无法从MSBuild引用Nuget包中“tools”文件夹中的可执行文件

6
我有一个C#控制台应用程序项目,我正在尝试将其转化为Nuget包,以便我的团队中的多个项目可以在.csproj文件中的AfterResolveReferences步骤中调用该项目的可执行文件。
我已经成功创建了Nuget包,.nuspec文件内容如下:
<package ...>
  <metadata>
    ...
  </metadata>
  <files>
    <file src="bin\Release\*.*" target="tools" />
  </files>
</package>

这个方法可以创建一个包含我的可执行文件在 "tools" 目录下的 Nuget 包。问题是,包含文件夹会包括 Nuget 包的版本号,而这个版本号会经常变化。我正在尝试在 .csproj 文件中像这样引用它:

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

当我在路径中包含PackageName.1.2.3时,它的工作效果符合预期,但显然这是一种非常脆弱的解决方案。当我只使用“AssemblyName.exe”时,会出现“命令 AssemblyName.exe 以代码 9009 退出”的情况。
很明显,有一个简单的标准来完成这种事情,但我不熟悉MSBuild和Nuget,因此我会非常感谢任何建议。
实际上,我想要实现的是创建一个TypeScript文件,其中包含从我的模型项目中定义的C#类派生的接口,使用TypeLite.Lib包。 TypeScript文件必须在构建Web项目之前创建,因为Web项目中的TypeScript代码依赖于该输出中包含的接口。我可以接受更优雅的解决问题的建议,但无论如何,我仍然想知道如何解决引用问题。
1个回答

8
NuGet包应该是自包含的,用户在使用NuGet包时不需要向项目文件添加任何内容。
NuGet包还可以包含构建逻辑-如果您将PackageName.targets文件放入build目录中,则会自动将其包含到引用NuGet包的项目中。从那里,您可以定义目标,并通常使用$(MSBuildThisFileDirectory)..\tools\MyTool.exe引用工具。
这很重要,因为packages目录仅用于通过packages.config进行“传统”的NuGet引用,而不是通过新型PackageReference引用NuGet包的方式,其中所有项目/解决方案共享用户级全局包缓存(没有解决方案本地副本)。

谢谢Martin,这真的很有帮助。我会尝试用这种方式来做,但是我忽略了一些现在变得很重要的东西。MyTool.exe的参数需要由消费项目定义(我是在.csproj文件中进行的,但如果在消费项目的web.config中进行会更好)。是否有一种逻辑机制,使MyTool.exe可以读取消费项目的配置文件? - wwarby
您可以始终定义/使用项目可以设置的自定义属性。 - Martin Ullrich
用这种方法解决了问题 - 非常感谢你的帮助! - wwarby

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接