2014-01-17 42 views
3

我正在创建一个nuget包,我想确保它可以在所有场景下工作。获取nuget包目录的位置

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

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

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

(背景资料)

我正在写需要本机DLL复制到bin目录软件包。我可以使用后期构建事件,但这似乎有点冒失。我宁愿包含一个使用SkipUnchangedFiles = true调用msbuild < copy>任务的目标,但是为了达到这个目的,我需要知道packages文件夹的位置。

回答

5

要解决背景信息部分中描述的问题,您有2个步骤。

A.确保本地的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.创建一个安装。 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 
+0

.dll是否被添加为像这样的参考? – Tony

+2

不,这些是本机dll,所以OP要他们把它当作内容。如果你想要,你可以采取这种方法。将一些xml文件或图像复制到bin文件夹。 – CarllDev

+0

感谢您的澄清。我读了5次本机,并没有陷入。 – Tony

1

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

+0

如果我需要,我可以,但什么我真的寻找这个问题是一个预先建立的方式来做到这一点。我只是检查一下,以确保我在下沉工作之前需要手工制作一些东西。加载nuget config很简单,但nuget在目录结构的几个级别配置“cascade”,所以正确的做法并不像听起来那么低调。但你是对的 - 如果没有固定的方法去做,我将不得不建立自己的。 – JMarsch

1

在install.ps1文件中,$ INSTALLPATH给你包目录的位置 - 所有你需要做的就是去到它的父,如下所示:

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

这与我最终如何做到这一点有关。我使用了上面的帮助,但是我想在构建时需要该属性,而不是在安装包时。我最终做了一些与SQL服务器精简版非常类似的东西 - 我使用nuget编写了一个构建后事件,将事件从软件包位置复制到bin文件夹。只要每个人都拥有相同的软件包位置,就可以工作 - 因为我只能在软件包安装时发现位置,而不是在构建时发现。谢谢,+1。 – JMarsch

10

从内。目标文件,您可以使用$(MSBuildThisFileDirectory)属性访问当前文件的位置。

假设.targets文件中的NuGet生成文件夹,你可以用这样的相对路径到达自己的包文件夹:

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

尽管接受的答案解决了潜在的问题,但它会回答标题中的问题(获取NuGet包目录的位置)。 –