67

ビルド後のイベントでこのコマンドを使用して、プロジェクトから nuget パッケージを生成します。変数%conf%は正しい構成 (デバッグまたはリリース) に設定され%1、プロジェクト名 (例: "MyCompany.MyProject") です。

nuget pack -Prop Configuration=%conf% "%1.csproj" -exclude *.sql -IncludeReferencedProjects

このパッケージは、私たち自身の使用のみを目的としており、nuget で公開されることはありません。それは私たちのプライベートリポジトリで終わります。

プロジェクトには、 と に設定されているファイルがありgenerate action : contentますcopy local : always。(私の Visual Studio はフランス語なので、翻訳が 100% 確実ではありません)。名前を付けましょうimportantfile.xml

生成されたパッケージでは、次の構造になります。

- content
    - importantfile.xml
- lib
    -net45 (.NetFramework,Version=v4.5)
        -MyCompany.MyProject.dll

importantfile.xmlこれは問題ありません。このファイルは重要なので、パッケージにデプロイしたいのです。

パッケージを別のプロジェクトにインストールするimportantfile.xmlと、プロジェクトのルートにデプロイされます。それで大丈夫です。しかし、それは設定されていませんcopy local : always

パッケージをインストールするこのプロジェクトに参加する必要importantfile.xmlがあります。copy local : always

どうすればそれを達成できますか?

ノート :

パッケージをインストールした直後にファイルを設定できcopy local : alwaysますが、それは大したことではありません。パッケージの後の更新でこのプロパティがそのままになるのであれば、私はそれを受け入れますが、そうではありません。パッケージを更新すると、 (ここに記載されているように)copy localにリセットされます。never

プロジェクトのフォルダーに nuspec ファイルがあります。

<?xml version="1.0"?>
<package >
  <metadata>
    <id>$id$</id>
    <version>$version$</version>
    <title>$title$</title>
    <authors>$author$</authors>
    <owners>$author$</owners>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>$description$</description>
    <copyright>Copyright 2014</copyright>
    <tags>some random tags</tags>
  </metadata>
</package>
4

5 に答える 5

163

PowerShell スクリプトを使用する代わりに、パッケージ ID と同じ名前のMSBuild ターゲットまたは小道具ファイルを使用する別の方法があります。

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup>
    <None Include="$(MSBuildThisFileDirectory)importantfile.xml">
      <Link>importantfile.xml</Link>
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
  </ItemGroup>
</Project>

次に、nuspec ファイルで、必要なファイルをContentディレクトリに追加する代わりに、それらをBuildターゲット ファイルと一緒にディレクトリに追加します。

  • 建てる
    • 重要なファイル.xml
    • MyPackage.targets
  • ライブラリ
    • net45
      • MyAssembly.dll

アーキテクチャごとに異なるコンテンツが必要な場合は、アーキテクチャ フォルダをBuildそれぞれの下に追加して、独自のターゲット ファイルを作成することもできます。

NuGet ディレクトリで PowerShell スクリプトよりもターゲット ファイルを使用する利点Content:

于 2015-05-22T01:10:27.347 に答える
41

皆さんがこれに対する実用的な解決策を持っていることは知っていますが、私にとってはうまくいかなかったので、NLog.config NuGet パッケージinstall.ps1 (github ソースはこちら) から取り出したものを共有します。

注: これは私のコードではありません。これは、知識を共有するだけの NLog.config nuget パッケージの install.ps1 の内容です。

私にはもう少し簡単に思えますが、これに遭遇する可能性が高い他の人を助けることを望んでいます.

BuildAction で受け入れられる int 値はこちらで、CopyToOutputDirectory で受け入れられる値はこちらで確認できます。

リンクが再び壊れた場合 ここに画像の説明を入力

フィールド prjBuildActionCompile 1
ファイルがコンパイルされます。

prjBuildActionContent 2
ファイルは Content プロジェクトの出力グループに含まれます (「アプリケーション、サービス、およびコンポーネントのデプロイ」を参照)

prjBuildActionEmbeddedResource 3
ファイルは、生成されたメイン アセンブリまたはサテライト アセンブリにリソースとして含まれます。

prjBuildActionNone 0
アクションは実行されません。

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

$configItem = $project.ProjectItems.Item("NLog.config")

# set 'Copy To Output Directory' to 'Copy if newer'
$copyToOutput = $configItem.Properties.Item("CopyToOutputDirectory")

# Copy Always Always copyToOutput.Value = 1
# Copy if Newer copyToOutput.Value = 2  
$copyToOutput.Value = 2

# set 'Build Action' to 'Content'
$buildAction = $configItem.Properties.Item("BuildAction")
$buildAction.Value = 2
于 2014-09-30T20:34:57.730 に答える
7

ビルド フォルダーから出力フォルダー (bin/debug または bin/release) にファイルをコピーするこれを作成しました。私にとって魅力のように機能します。

Nuspec ファイル:

<package>
  <files>
    <file src="\bin\Release\*.dll" target="lib" />
    <file src="\bin\Release\x64\*.dll" target="build\x64" />
    <file src="\bin\Release\x86\*.dll" target="build\x86" />
    <file src="MyProject.targets" target="build\" />    
  </files>
</package>

MyProject.targets

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup>
    <NativeLibs Include="$(MSBuildThisFileDirectory)**\*.dll" />
    <None Include="@(NativeLibs)">
      <Link>%(RecursiveDir)%(FileName)%(Extension)</Link>
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
  </ItemGroup>
</Project>
于 2017-07-03T07:28:15.610 に答える
2

PowerShell とInstall.ps1NuGet が提供するフックを使用できます。

ドキュメントを参照してください。

PowerShell を使用してimportantfile.xml、属性に含まれるコンテンツ要素を「検索」する必要があります。スクリプトがそれを見つけたら、<CopyToOutputDirectory>Always</CopyToOutputDirectory>子要素として追加する必要があります。

    <Content Include="importantfile.xml">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>

PowerShell のスニペットは、こちら にあります。ファイルを見てください.ps1

以下を試すことができます(テストされていません)。ファイルに名前を付けて、フォルダーInstall.ps1にコピーする必要があります。tools

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

# Load project XML.
$doc = New-Object System.Xml.XmlDocument
$doc.Load($project.FullName)
$namespace = 'http://schemas.microsoft.com/developer/msbuild/2003'

# Find the node containing the file. The tag "Content" may be replace by "None" depending of the case, check your .csproj file.
$xmlNode = Select-Xml "//msb:Project/msb:ItemGroup/msb:Content[@Include='importantfile.xml']" $doc -Namespace @{msb = $namespace}


#check if the node exists.
if($xmlNode -ne $null)
{
    $nodeName = "CopyToOutputDirectory"

    #Check if the property already exists, just in case.
    $property = $xmlNode.Node.SelectSingleNode($nodeName)
    if($property -eq $null)
    {
        $property = $doc.CreateElement($nodeName, $namespace)
        $property.AppendChild($doc.CreateTextNode("Always"))
        $xmlNode.Node.AppendChild($property)

        # Save changes.
        $doc.Save($project.FullName)
    }
}

パッケージをアンインストールするときに、すべてが完全に削除されているかどうかも確認する必要があります。

Jonhhy5によるメモ

経由でパッケージを更新するとupdate-package、Visual Studio は、プロジェクトが「環境外」で変更されていることを警告します。が原因$doc.Save($project.FullName)です。コマンドが完全に終了するにリロードをクリックすると、エラーが発生することがあります。秘訣は、プロセスが終了するまでダイアログをそのままにしてから、プロジェクトリロードすることです。

于 2014-01-16T12:14:20.447 に答える