2013-01-10 14 views
18

मैंmsbuild, पर्यावरण चर सेट करने के लिए कैसे?

परियोजना फ़ाइल का उपयोग वातावरण चर सेट करने के लिए कोशिश कर रहा हूँ (उदा। .vcxproj) मैं संपत्ति कार्यों को देखा है, लेकिन यह इस तरह के समारोह के लिए नहीं मालूम था।

मुझे पता है कि पर्यावरण परिवर्तक को पुनर्प्राप्त करने का एक तरीका है लेकिन इसे सेट करने के तरीके को नहीं मिला।

मुझे लगता है कि प्रोजेक्ट फ़ाइल में पर्यावरण चर सेट करने का तरीका होना चाहिए।

उत्तर

4

योग्य कुछ बातें:

1) आप केवल MSBuild के संदर्भ में चर का उपयोग कर रहे हैं, तो आप सिर्फ मानक MSBuild चर बजाय एक वातावरण चर

2 सेट करने की कोशिश की उपयोग कर सकते हैं) यदि एक env var सेट करने की आवश्यकता है, तो, यह बॉक्स ऑफ चीज नहीं है। आपको एक कस्टम कार्य लिखना होगा और फिर प्रोजेक्ट फ़ाइल में इसका लाभ उठाना होगा। यहां एक एमएसडीएन धागे का एक लिंक है जो यह बताता है कि यह कैसे करें।
http://social.msdn.microsoft.com/forums/en-US/msbuild/thread/0fb8d97d-513e-4d37-8528-52973f65a034

+0

उत्तर के लिए धन्यवाद! –

+1

कृपया एक कोड नमूना शामिल करें, लिंक को विश्वसनीय नहीं किया जा सकता – Rbjz

23

कोडित कार्य को MSBuild v4.0 के बाद प्रोजेक्ट फ़ाइल पर सही रखा जा सकता है। इस तरह:

<UsingTask 
    TaskName="SetEnvironmentVariableTask" 
    TaskFactory="CodeTaskFactory" 
    AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v$(MSBuildToolsVersion).dll"> 

    <ParameterGroup> 
    <Name ParameterType="System.String" Required="true" /> 
    <Value ParameterType="System.String" Required="true" /> 
    </ParameterGroup> 

    <Task> 
    <Using Namespace="System" /> 
    <Code Type="Fragment" Language="cs"> 
     <![CDATA[ 
     Environment.SetEnvironmentVariable(Name, Value); 
     ]]> 
    </Code> 
    </Task> 

</UsingTask> 

ध्यान दें कि MSBuild 14+ में, AssemblyFile संदर्भ सिर्फ होना चाहिए:

<Target Name="SampleTarget" BeforeTargets="Build"> 
    <SetEnvironmentVariableTask Name="TEST_ENV_VAR" Value="$(MSBuildProjectName)" /> 
</Target> 

उतना है:

AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.Core.dll" 

SetEnvironmentVariableTask तो लक्ष्य से इस्तेमाल किया जा सकता छोटे MSBuild कार्य (ओं) के लिए एक अलग डीएलएल संलेखन से अधिक आसान।

+0

जितना संभव हो मैं कोशिश कर सकता हूं, मैं इसे विजुअल स्टूडियो 2012 के साथ काम करने के लिए नहीं मिला। हालांकि, मैं एक समाधान ढूंढने में सक्षम था [यहां] (http://stackoverflow.com/ नहीं-संदर्भ-निर्भरता-संयोजनों में टी -4-टेम्पलेट जब-का उपयोग कर-transformonbuil/20,688,714 # 20,688,714) प्रश्न/5,886,938/कर सकते हैं। –

+0

ऐसा लगता है कि केवल एक दिए गए लक्ष्य के संदर्भ में ही काम करता है; जब मैंने किसी अन्य लक्ष्य से env var को पढ़ने की कोशिश की तो यह अब – gschuager

+1

पर्यावरण का प्रयास करने की कोशिश नहीं कर रहा था .etEnvironmentVariable (नाम, मूल्य, पर्यावरण VariableTarget.Machine) या पर्यावरण .etEnvironmentVariable (नाम, मान, पर्यावरणVariableTarget.User)। डिफ़ॉल्ट पर्यावरण है .etEnvironmentVariable (नाम, मूल्य, पर्यावरण VariableTarget.Process) – herskinduk

0

आप एसईटी XXX = $ (XXX) लाइनों के अनुक्रम के रूप में एक टेक्स्ट फ़ाइल (.cmd) में पर्यावरण चर लिखने पर विचार कर सकते हैं। फिर कमांड विंडो में .cmd निष्पादित करें।

उदा। सभी एसईटी कमांड के साथ एक आइटम समूह को परिभाषित करें, फिर प्रत्येक आइटम को .cmd टेक्स्ट फ़ाइल में एक पंक्ति में लिखने के लिए कार्य 'WriteLinesToFile' का उपयोग करें।

<ItemGroup> 
    <BuildEnvItem Include="REM This file is auto generated. Do not edit" /> 
    <BuildEnvItem Include="SET TEST_ENV_VAR=$(TEST_ENV_VAR)" /> 
    <!-- add more as needed --> 
<ItemGroup> 

<Target Name="DefineBuildEnvironmentVariables"> 
    <WriteLinesToFile File="Build_env.cmd" Lines="@(BuildEnvItem)" Overwrite="true" Encoding="Unicode"/> 
</Target> 

यह ऐसी स्थिति में उपयोगी हो सकता है जहां एक मौजूदा .cmd है जो msbuild का उपयोग कर रहा है। प्रारंभिक .cmd Build_env.cmd उत्पन्न करने के लिए msbuild का उपयोग करता है, और उसके बाद आगे बढ़ने से पहले Build_env.cmd को कॉल करता है।

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