获取nuget包目录的位置

时间:2014-01-17 17:00:04

标签: c# msbuild nuget

我正在创建一个nuget包,我想确保它适用于所有场景。

在这种情况下,我使用“Build”约定文件夹添加构建目标。我添加的目标需要知道nuget包文件夹的位置。

我发现的很多例子都假设他们只能使用“.. \ Packages”,但Nuget允许你通过nuget.config文件重新定位packages文件夹。

有没有办法从build.targets文件中获取nuget包文件夹的正确位置?

(背景资料)

我正在编写一个需要将本机dll复制到bin目录的包。我可以使用post build事件,但这似乎有点hacky。我宁愿包含一个调用msbuild< copy>的目标。使用SkipUnchangedFiles = true的任务,但要使其工作,我需要知道packages文件夹的位置。

4 个答案:

答案 0 :(得分:11)

在.targets文件中,您可以使用$(MSBuildThisFileDirectory)属性访问当前文件的位置。

假设.targets文件位于nuget构建文件夹中,您可以使用以下相对路径访问其自己的包文件夹:

<PropertyGroup>
    <ThisPackageDirectory>$(MSBuildThisFileDirectory)..\</ThisPackageDirectory>
    ...

答案 1 :(得分:5)

要解决背景信息部分中描述的问题,您需要执行两个步骤。

一个。确保将本机dll复制到项目中 - 编辑nuspec的一部分,以便在构建包时将文件复制到项目根目录中:

<?xml version="1.0"?>
<package>
  <metadata>
    ...
  </metadata>
  <files>
    <file src="install.ps1" target="Tools"/>
    <file src="nativedll1.dll" target="content" />
    <file src="nativedll2.dll" target="content" />
  </files>
</package>

B中。创建一个install.ps1文件(请注意我将其包含在上面的示例中) 你的install.ps1文件看起来应该是这样的。

param($installPath, $toolsPath, $package, $project)

$file1 = $project.ProjectItems.Item("nativedll1.dll")
$file2 = $project.ProjectItems.Item("nativedll2.dll")

# set 'Copy To Output Directory' to 'Copy if newer'
$copyToOutput1 = $file1.Properties.Item("CopyToOutputDirectory")
$copyToOutput1.Value = 2

$copyToOutput2 = $file2.Properties.Item("CopyToOutputDirectory")
$copyToOutput2.Value = 2

答案 2 :(得分:1)

为什么不创建一个自定义的MsBuild任务,将nuget.config文件作为XDocument加载并获取元素的值?

答案 3 :(得分:1)

在install.ps1文件中,$ installPath为您提供了包目录的位置 - 您需要做的就是这样转到它的父目录:

$packagesFolder = (get-item $installPath).parent.FullName