2017-08-09 51 views
1

我有一个C#控制台应用程序项目,我试图变成一个Nuget包,以便我的团队中的多个项目可以调用可执行文件此项目位于.csproj文件内的AfterResolveReferences步骤中。无法从MSBuild的Nuget包的“工具”文件夹中引用可执行文件

我创建了NuGet包只是一个.nuspec文件看起来是这样的罚款:

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

这工作,并创建一个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文件,其中包含从使用TypeLite.Lib包在我的模型项目中定义的C#类派生的接口。必须在构建Web项目之前创建TypeScript文件,因为Web项目中的TypeScript代码取决于此输出中包含的接口。我愿意提供更优雅的方法来解决这个问题,但我仍然想知道如何解决参考问题。

回答

1

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

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

这是重要的,因为packages目录是通过packages.config而不是引用的NuGet包,新风格PackageReference方式仅用于“经典”的NuGet引用,所有的项目/解决方案共享的用户级别全球包缓存(没有解决方案 - 本地副本)。

+0

感谢Martin,这真的很有帮助。我会尽力这样做,但我忽略了一些现在很重要的东西。 MyTool.exe的参数需要由消费项目来定义(我在.csproj文件中这样做,但如果它在消费项目的web.config中会更好)。是否有一种逻辑机制可以通过MyTool.exe读取消费项目的配置文件? – wwarby

+0

您可以随时定义/使用项目可以设置的自定义属性 –

+0

使用这种方法得到它的工作 - 非常感谢您的帮助! – wwarby

相关问题