无法在"工具"中引用可执行文件。来自MSBuild的Nuget包的文件夹

时间:2017-08-09 07:48:51

标签: c# visual-studio msbuild nuget nuget-package

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

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

<package ...>
  <metadata>
    ...
  </metadata>
  <files>
    <file src="bin\Release\*.*" target="tools" />
  </files>
</package>

这可以工作并创建一个Nuget包,其中包含我的可执行文件&#34; tools&#34;目录。问题是包含文件夹包含将经常更改的Nuget包的版本号。我试图在.csproj文件中引用它:

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

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

对于我不熟悉的这类事情来说,显然是一个简单的标准 - MSBuild和Nuget不是我最强的套装,所以我非常感激任何建议。

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

1 个答案:

答案 0 :(得分:5)

这个想法是NuGet包应该是自包含的。也就是说,当使用nuget包时,用户不需要向项目文件添加任何内容。

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

这很重要,因为packages目录仅用于&#34; classic&#34; NuGet通过packages.config引用,而不是引用NuGet包的新式PackageReference方式,其中所有项目/解决方案共享用户级全局包缓存(无解决方案本地副本)。