2011-12-12 6 views
22

मैं NuGet पैकेज बना रहा हूं और इसके लिए मैंने नुस्पेक मेनिफेस्ट फ़ाइल बनाई है। content फ़ोल्डर में मेरे पास दो फाइलें हैं, test.exe और test.config। अब जब मैं कोई भी उपयोगकर्ता इस पैकेज को स्थापित करता हूं, तो मैं इन परियोजनाओं में "प्रतिलिपि बनाने के लिए प्रतिलिपि निर्देशिका" को बदलना चाहता हूं।NuGet: मैं install.ps1 फ़ाइल के साथ फ़ाइलों की संपत्ति कैसे बदल सकता हूं?

मुझे संबंधित प्रश्न NuGet how to apply properties to files मिला, जो दिखाता है कि यह PowerShell install.ps1 स्क्रिप्ट का उपयोग करके ऐसा कर सकता है, लेकिन मुझे नहीं पता कि वह फ़ाइल कैसे बनाएं।

उत्तर

37

आपकी install.ps1 फ़ाइल को इस तरह कुछ दिखना चाहिए।

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

$file1 = $project.ProjectItems.Item("test.exe") 
$file2 = $project.ProjectItems.Item("test.config") 

# 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 
+1

// शक्तिशक्ति में कोई टिप्पणी नहीं है, इसका उपयोग करें :) अन्यथा बहुत उपयोगी, धन्यवाद – grahamrhay

+1

@ ब्रेंट: आइटम ("CopyToOutputDirectory") के लिए स्वीकृत मानों पर कुछ दस्तावेज़ों की तलाश में मुझे पता है कि यह एक डीटीई enum है लेकिन ऐसा प्रतीत नहीं होता इसे ढूंढें: -/आपके संदर्भ का एक लिंक मेरे लिए और इस उत्तर को प्राप्त करने वाले किसी भी व्यक्ति के लिए बहुत मददगार होगा। – workabyte

15

यहां इस समस्या को हल करने के लिए अंत समाप्त करने के लिए पर थोड़ा और अधिक विस्तार है:

आप दो चीजों स्थिति सही ढंग पर स्थापित कर रहे हैं स्थापित सुनिश्चित करने के लिए क्या करने की जरूरत ...

  1. फ़ाइलों की स्थिति को चिह्नित करने के लिए install.ps1 स्क्रिप्ट लिखें।
  2. सुनिश्चित करें कि install.ps1 स्क्रिप्ट nuget पैकेज में उपकरण निर्देशिका में है।

Install.ps1 स्क्रिप्ट

निम्न उदाहरण स्क्रिप्ट रिकर्सिवली "सामग्री" में हर फ़ाइल और "देखें" "नए को कॉपी" के रूप में निर्देशिका का प्रतीक होगा। ध्यान दें कि इस उदाहरण स्क्रिप्ट को पढ़ने और समझने के लिए स्पष्ट करने के लिए लिखा गया है। यह विजुअल स्टूडियो प्रोजेक्ट की मूल निर्देशिका में सामग्री और दृश्य फ़ोल्डरों में प्रत्येक फ़ाइल को चिह्नित करेगा। उपकरण

आप स्क्रिप्ट के लिए उपकरण निर्देशिका के लिए install.ps1 फ़ाइल की प्रतिलिपि चाहिए करने के लिए

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

function MarkDirectoryAsCopyToOutputRecursive($item) 
{ 
    $item.ProjectItems | ForEach-Object { MarkFileASCopyToOutputDirectory($_) } 
} 

function MarkFileASCopyToOutputDirectory($item) 
{ 
    Try 
    { 
     Write-Host Try set $item.Name 
     $item.Properties.Item("CopyToOutputDirectory").Value = 2 
    } 
    Catch 
    { 
     Write-Host RecurseOn $item.Name 
     MarkDirectoryAsCopyToOutputRecursive($item) 
    } 
} 

#Now mark everything in the a directory as "Copy to newer" 
MarkDirectoryAsCopyToOutputRecursive($project.ProjectItems.Item("Content")) 
MarkDirectoryAsCopyToOutputRecursive($project.ProjectItems.Item("Views")) 

कॉपी nuget द्वारा निष्पादित की जाने। ऐसा करने के लिए आप निम्न को nuspec टेम्पलेट में जोड़ सकते हैं।

इस मामले में
<files> 
    <file src="install.ps1" target="Tools"/> 
</files> 

नोट मैं अपने दृश्य स्टूडियो परियोजना के रूट में install.ps1 फ़ाइल है और के रूप में "कॉपी नए यदि" चिह्नित।

+0

उपर्युक्त 'अपवाद कॉलिंग "आइटम" के साथ "1" तर्क ":" पैरामीटर गलत है। (HRESULT: 0x80070057 (E_INVALIDARG) से अपवाद) " टूल्स \ install.ps1: 3 char: 27 + $ project.ProjectItems.Item <<<< ("सामग्री")। ProjectItems.Item ("file.jar")। Properties.Item ("CopyToOutputDirectory")। मान = 1 + श्रेणीइन्फो: निर्दिष्ट नहीं: (:) [], MethodInvocationException + FullyQualifiedErrorId: ComMethodTargetInvocation ' मैं इस बदलते ' MarkDirectoryAsCopyToOutputRecursive ($ project.ProjectItems द्वारा तय की।मद ("सामग्री")) ' को ' MarkDirectoryAsCopyToOutputRecursive ($ परियोजना)) ' – Paul

+1

@Paul अपने सुझाव सेट ** CopyIfNewer अपनी परियोजना है, जो शायद नहीं है कि आप क्या चाहते में सब कुछ **। आप अपनी परियोजना के उस फ़ोल्डर में केवल फाइलों के लिए गुण सेट करने के लिए '$ project.ProjectItems.Item ("") का उपयोग कर सकते हैं। यह उत्तर से 100% स्पष्ट नहीं है। –

संबंधित मुद्दे