在NuGet包中将VS2017的“生成操作”设置为“内容”

3

我使用以下命令在GitLab中创建我的NuGet包。

nuget pack -Prop Configuration=Release -OutputDirectory nuget %REPONAME%\%APPNAME%\%APPNAME%.csproj

如果我将Build Action声明为Content,并将Copy To Output Directory声明为Always,则在安装nuget包时不会应用它。关于此问题,下面的答案有点让人困惑:Set content files to "copy local : always" in a nuget package。我没有*.nuspec文件,它是通过上述命令自动生成的。
以下是需要翻译的内容:
  1. 我在解决方案中声明了一个Install.ps1文件,位于tools/*
  2. 我想要自动将tools文件夹与Install.ps1脚本一起包含在nuget包中,以便在安装时调用该脚本

Install.ps1脚本

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

$configItem = $project.ProjectItems.Item("snap7.dll")

# set 'Copy To Output Directory' to 'Always'
#    0 = Never
#    1 = Always
#    2 = PreserveNewestFile
$copyToOutput = $configItem.Properties.Item("CopyToOutputDirectory")
$copyToOutput.Value = 1

# set 'Build Action' to 'Content'
#    0 = None
#    1 = Compile
#    2 = Content
#    3 = EmbeddedResource
$buildAction = $configItem.Properties.Item("BuildAction")
$buildAction.Value = 2

这个问题怎么样?你从Wendy的回答中得到了有用的信息吗?我已经在Tools文件夹中创建了一个带有install.ps1的包,当我安装它时它可以正常工作:https://1drv.ms/u/s!Ai1sp_yvodHfe8hmU7Duo9pCh5U - Leo Liu
这不是我想要的解决方案。我目前正在开发一个小应用程序,以自动将此文件添加到GitLab中。 - Dominic Jonas
感谢您的回复。由于您想要自动添加 install.ps1,这在您之前的问题中并未提及(如果我将构建操作声明为内容,并将复制到输出目录设置为始终,则不会应用于 nuget 包或安装时)。因此,您可以更新您的问题并在此分享您的解决方案,以帮助其他遇到相同问题的社区成员。谢谢。 - Leo Liu
3个回答

1
您需要将install.ps1文件添加到您的NuGet包中。
在使用您在原始帖子中提供的nuget pack命令后,它会在nuget文件夹中生成一个包。
然后,请使用NuGet Package Explorer打开此包,并通过NuGet Package Explorer菜单中的CONTENT-> Add-> Tools Folder添加一个工具文件夹。然后将您的install.ps1文件添加到tools文件夹中。
现在,当该包安装到项目中时,它将调用install.ps1文件以将文件的“复制到输出目录”属性设置为“始终复制”。

0
为了自动将文件/文件夹添加到NuGet包中,我编写了一个名为NuGetLib的小工具。
全局变量会在安装程序中自动设置。
在我的.gitlab-ci.yml文件中,只需要这4行代码就可以构建包含所有依赖项和工具文件夹的NuGet包:
# create output directory
- mkdir nuget
# create nuget package
- nuget pack -Prop Configuration=Release -OutputDirectory nuget %REPONAME%\%APPNAME%\%APPNAME%.csproj
# Add tools folder
- nugetlib add -t nuget -f .\%REPONAME%\%APPNAME%\tools
# deploy package to local repo
- xcopy /s /y /i nuget %NUGET_PATH%

您可以在此处下载:https://github.com/dojo90/nugetLib/releases


0

来自OP的说法:

我没有*.nuspec文件。它是由上述命令自动生成的。

这不应该阻止您使用*.nuspec文件。它应该与您的项目同名(例如,My.Consoto.Library.csproj ==> My.Consoto.Library.nuspec),并且您仍然可以使用与OP中显示的相同的.csproj命令。

然后,在*.nuspec文件中,您可以编写如下代码:

<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
  <metadata minClientVersion="2.5">
    <id>$id$</id>
    <version>$version$</version>
    <title>$title$</title>
    <authors>$author$</authors>
    <owners>Consoto LLC</owners>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>$description$</description>
    <copyright>$copyright$</copyright>    
    <projectUrl>https://dev.azure.com/Consoto/</projectUrl> 
    <iconUrl>http://www.consoto.com/images/favicon.ico</iconUrl> 
    <releaseNotes>My custom release notes</releaseNotes> 
    <language>en-US</language> 
    <tags>MyCustomTag1</tags>
    <dependencies>
      <dependency id="My.Other.Library" version="1.0.0" />
    </dependencies>
  </metadata>  
  <files>
        <file src="nuget_tools/install.ps1" target="tools/" />
   </files>
</package>

.nuspec 中的令牌将接收 .csproj 的 AssemblyInfo.cs 的值。

我意识到我上面的示例有一个硬编码的依赖项,我还没有尝试过去掉那部分..所以我会回来更新我的答案,看看更通用的 *nuspec 是否能与 OP 中演示的命令无缝配合。


实际上我不再使用这个项目格式了。使用新的格式,如果你使用 dotnet pack -c Release,一切都会自动完成。 - Dominic Jonas

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