বর্তমান বিল্ড সংস্করণে আমি কীভাবে ওয়াইএক্স ইনস্টলার সংস্করণটি সেট করতে পারি?


134

আমি একটি অ্যাপ্লিকেশন এবং এর ওয়াইএক্স ইনস্টলার লিখেছি এবং এটি সাবভারশন ব্যবহার করে সংস্করণ নিয়ন্ত্রণে রেখেছি। যখন ওয়াইএক্স ইনস্টলার তৈরি হয় আমি তার সংস্করণ নম্বরটি অ্যাপ্লিকেশনের বর্তমান বিল্ড সংস্করণ হতে চাই। আমি কীভাবে এটি সম্পাদন করব? আমি অ্যাপ্লিকেশন কোড করতে সি # ব্যবহার করেছি।

এনবি আমি এই প্রকল্পটি তৈরি করতে সিসনেট ব্যবহার করছি

উত্তর:


181

আপনি ব্যবহার করতে পারেন Product/@Version="!(bind.FileVersion.FileId)"( যে ফাইলটি থেকে আপনি সংস্করণ নম্বর পেতে চান তা FileIdদিয়ে প্রতিস্থাপন Idকরুন) এবং লাইট.এক্সই দ্বারা উল্লিখিত ফাইলটির সংস্করণটির সাথে মানটি তৈরি করবে FileId


4
আমি কি খুঁজছিলাম! যদিও আমাকে "! (Bind.FileVersion.FileId)" "(" "$" এর পরিবর্তে "" ") ব্যবহার করতে হয়েছিল, অন্যথায় আমার একটি প্রিপ্রসেসরের নির্দেশিকা ত্রুটি হয়েছে।
নিকোলাস পাইসেকি

8
হ্যাঁ, দুঃখিত, আমি ক্রমাগত মানসিক ভুল করি। prep প্রিপ্রোসেসর পরিবর্তনশীল এবং! বাইন্ডার পরিবর্তনশীল।
রব মেনশিং

20
নোট করুন যে "ফাইলিড" একটি <ফাইল আইডি = "ফাইলিড" ...> উপাদান থেকে হওয়া উচিত এবং দৃশ্যত বিন্দু (।) অক্ষর অন্তর্ভুক্ত করতে পারে।
জেমস হুগার্ড

6
বান্ডেল / বুটস্ট্র্যাপারের জন্যও কি এটি করা সম্ভব?
নোবেলাস

6
সম্পর্কিত ডকুমেন্টেশনের একটি লিঙ্ক, বিভাগ: বাইন্ডার ভেরিয়েবলস
এমসিডন

39

আমি আমার এক্সিকিউটেবল থেকে ফাইল সংস্করণ পড়তে প্রিপ্রসেসর এক্সটেনশন লিখে আমার প্রকল্পগুলির একটিতে এটি করেছি। উইন্ডোজ ফাইলটি দেখতে এমন কিছু দেখাচ্ছে:

<?define ProductName="$(fileVersion.ProductName($(var.MyApp.TargetPath)))" ?>
<?define CompanyName="$(fileVersion.CompanyName($(var.MyApp.TargetPath)))" ?>
<?define ProductVersion="$(fileVersion.ProductVersion($(var.MyApp.TargetPath)))" ?>
<Product 
    Id="<product ID>" 
    Name="$(var.ProductName)" 
    Version="$(var.ProductVersion)" 
    Manufacturer="$(var.CompanyName)" 
    Language="1033" 
    UpgradeCode="<upgrade code>">

আমি কোডপ্লেক্সে কোড পোস্ট করেছি: http://wixfileversionext.codeplex.com/


আপনার এক্সটেনশন এখনও কাজ করে? আমি এটিকে রেফারেন্স হিসাবে যুক্ত করার চেষ্টা করেছি এবং আমি একটি ত্রুটি পেয়েছি।
স্টিফান ভাসিলজেভিচ

এই এক্সটেনশনটি Wix 3.5 এর সাথে দুর্দান্ত কাজ করেছে, উইক্স 3.9 এ আপডেট করার পরে এটি একটি নলপয়েন্টারএক্সসেপশন ছুড়ে ফেলে। স্পষ্টতই এই সংস্করণগুলির মধ্যে কিছু ভেঙে গেছে।
গিগো

2
@ জিগো আমি এটির মাধ্যমে কাজ করতে পেরেছি <?define ProductName="!(bind.property.ProductName)" ?><?define CompanyName="!(bind.property.Manufacturer)" ?><?define ProductVersion=!(bind.FileVersion.FileId) ?> যেখানে FileIdএ এর Idমধ্যে আপনার Fileউপাদানগুলির মধ্যে একটির গুণকের মান রয়েছে Component
জ্যারেড

কোডপ্লেক্স লিঙ্কটি আমার জন্য খুলছে না। আপনার নিজস্ব প্রসেসর এক্সটেনশান লেখার ব্যতীত অন্য কোনও উপায় আছে কি?
আরডিভি

28

যদি কেউ প্রকৃত এক্সএমএল উদাহরণ সন্ধান করে, এটি .NET সমাবেশগুলির সাথে কাজ করে (এবং আপনাকে অ্যাসেম্বলি বা কীপথ বৈশিষ্ট্যগুলি করতে হবে না)। আমি [...] স্থানধারীদের সাথে সম্পর্কযুক্ত কোডটি সরিয়েছি:

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Product [...] Version="!(bind.fileVersion.MyDLL)">
        [...]
        <Directory Id="TARGETDIR" Name="SourceDir">
            <Directory Id="ProgramFilesFolder" Name="PFiles">
                <Directory Id="INSTALLDIR" Name="MyDLLInstallLocation">
                    <Component Id="MainLib" Guid="[...]">
                        <File Id="MyDLL" Name="MyDll.dll" Source="MyDll.dll" />
                        [...]
                    </Component>
                    [...]
                </Directory>
            </Directory>
        </Directory>
    </Product>
</Wix>

1
এটি একটি আরও ভাল উত্তর। কাজের উদাহরণের জন্য আপনাকে ধন্যবাদ।
রোলগুলি

এটি আসল সংস্করণ নম্বরটি কোথায় আনছে?
foobar

@ ফুবার আমার এখানে আসার পরে বেশ কিছুক্ষণ হয়েছে, তবে আপনি যদি স্ট্রিংটি !(bind.fileVersion.MyDLL)<File Id="MyDLL"...
দেখেন তবে

এটি আমার পক্ষে ভাল কাজ করেছে। সংকলিত এক্সিকিউটেবলের পাশাপাশি dll এর জন্য কাজ করে যা একাধিক জায়গায় জিনিস পরিবর্তন না করেই ইনস্টলার সংস্করণ এবং ইউআই
কনটেন্টকে এক্সেল

21

আপনার মাইএপ অ্যাসেমব্লিউ ভার্সনের সাথে BeforeBuild Targetএবং ব্যবহার করে আপনার বুটস্ট্র্যাপার বান্ডিল সংস্করণটি মেলাতে এখানে একটি খুব সহজ উপায়DefineConstants

Bundle.wxs:

<Bundle Name="$(var.ProductName) Bootstrapper v$(var.BuildVersion)"
     Version="$(var.BuildVersion)"

Bootstrapper.wixproj:

<Target Name="BeforeBuild">
  <GetAssemblyIdentity AssemblyFiles="..\MyApp\bin\$(Configuration)\MyApp.exe">
    <Output TaskParameter="Assemblies" ItemName="AssemblyVersion" />
  </GetAssemblyIdentity>
  <PropertyGroup>
    <DefineConstants>BuildVersion=%(AssemblyVersion.Version)</DefineConstants>
  </PropertyGroup>
</Target>

@ অলিকাজমী আপনি নিজের var.ProductNameএবং var.BuildVersionকোথাও কোথাও তার সংজ্ঞা দিয়েছেন <Bundle>?
ব্রুক হেনস্লে

2
আমি এটি চেষ্টা করেছি এবং এটির পক্ষে যথেষ্ট সুপারিশ করতে পারি না - এটি টিমসিটির পক্ষে সমাবেশ প্যাচারের সাথে একত্রিত করুন এবং আপনি একটি বিজয়ী সূত্র পেয়েছেন। আমি বান্ডিল উপাদানটি ব্যবহার না করে একটি পণ্য উপাদান পরিবর্তে ব্যবহার করেছি এবং এখনও আমার জন্য কাজ করেছি।
ইব্রাহার মমতাজ

ভিএস কেবল BeforeBuildলক্ষ্যটিকে উপেক্ষা করতে পছন্দ করে তাই AfterTargets="AfterResolveReferences"আপনি আইডিই তৈরি করছেন তবে স্পষ্টভাবে নির্দিষ্ট করা প্রয়োজন
দিমিত্রি

আমি আমার * .wixproj মধ্যে Bootstrapper.wixproj কোড জুড়েছে এবং Product.wxs ফাইলে, আমি যেমন buildversion পরিবর্তনশীল সংজ্ঞা দিয়েছে:
RDV

4

আপনি আপনার সেটআপ প্রকল্পের জন্য এমএসবিল্ড স্ক্রিপ্টটিতে সংস্করণটি পাস করতে পারবেন ঠিক তেমনই আপনি অ্যাপ্লিকেশনটির বিল্ড স্ক্রিপ্টের জন্য পাস করতে পারবেন।

উদাহরণস্বরূপ, যদি আপনার সিআই সিস্টেমটি ভেরিয়েবলগুলি সংজ্ঞায়িত করে AppVersionএবং BuildNumberএবং আপনার এমএসবিল্ড স্ক্রিপ্টগুলিতে এটি প্রেরণ করে, আপনার উইক্সপ্রজ একটি সম্পর্কিত Versionসম্পত্তি তৈরি করতে পারে যা উইক্সের কাছে এটি ফরোয়ার্ড করে:

<PropertyGroup>
    <Version Condition=" '$(BuildNumber)' == '' ">0.0.1</Version>
    <Version Condition=" '$(BuildNumber)' != '' ">$(AppVersion).$(BuildNumber)</Version>
    <DefineConstants>Version=$(Version)</DefineConstants>
</PropertyGroup>

Versionআপনি যখন স্থানীয়ভাবে নির্মাণ করছেন তার প্রথম সংজ্ঞা ডিফল্ট সরবরাহ করে। এটি যা শেষ হয় তা Versionউইক্সে পরিবর্তনশীল হয়ে ওঠে । এটি ডাব্লুএসএক্স ফাইলটিতে এটি ব্যবহার করুন:

<Product Version="$(var.Version)" ...>
    <Package Description="$(var.ProductName) $(var.Version): $(var.ProductDescription)" ... />

আমি বর্ণনায় সংস্করণটি অন্তর্ভুক্ত করতে চাই যাতে উইন্ডো এক্সপ্লোরার থেকে (ফাইলের নাম বাদে বিশদ বিবরণে বা সম্পত্তি পৃষ্ঠাতে কলাম হিসাবে) সন্ধান করা সহজ হয়।

পরিবর্তনশীল হিসাবে সংস্করণটি পাস করা আপনাকে ফাইল থেকে পড়ার চেয়ে আরও নিয়ন্ত্রণ দেয়। আপনি যখন কোনও ফাইল থেকে পড়েন, আপনি প্রোগ্রাম্যাটিক সংস্করণের সমস্ত 4 টি অংশ পান। তবে, প্রোডাক্ট ভার্সনটি কেবল প্রথম 3 অংশ ব্যবহারের জন্য ডিজাইন করা হয়েছে।


ধন্যবাদ, এটি আমার দিনকে বাঁচিয়েছে। বিটিডাব্লু: উপরের কোডটি স্নিপড হয়ে গেছে আপনার প্রকল্পে (* .wxiproj)। কোনও ডিভাইস / ভিএসটিএস সিআই-বিল্ড পরিচালনা করার পক্ষে এটি সেরা উত্তর। যেহেতু আমার কাছে ইতিমধ্যে আমার চূড়ান্ত সংস্করণ পরিবর্তনশীল প্রস্তুত রয়েছে। এটি আমার ক্ষেত্রে পরিণত হয়েছে: <Version Condition=" '$(BuildVersionOfAsm)' != '' ">$(BuildVersionOfAsm)</Version>অন্যদিকে বিল্ডভেরিশনঅফএএসএম ডিভাইস পাইপলাইনে একটি পরিবর্তনশীল।
রোবেটো

আমি গতিশীলভাবে সংস্করণ বেছে নিতে চাই, এই পদ্ধতিটির জন্য আমাকে * .wixproj সংস্করণটি আপডেট করা চালিয়ে যেতে হবে। এই ক্ষেত্রে কোনও dll এর সংস্করণ করার উপায় আছে?
আরডিভি

@ আরডিভি এই দৃষ্টিভঙ্গির উদ্দেশ্যটি .wixproj সহ উত্স নিয়ন্ত্রণে কোনও ফাইল পরিবর্তন করে না। গতিশীল সংস্করণ নম্বরটি আপনার সিআই সিস্টেম দ্বারা সরবরাহ করা হয়েছে (অ্যাপ্লিকেশন এবং বিল্ডনিম্বার এই উদাহরণে)। সাধারণত, আপনি প্রধান এবং গৌণ সংস্করণ নম্বরগুলি সিআই ভেরিয়েবল হিসাবে সেট করেন এবং সিআই সিস্টেমটি গতিশীলভাবে বিল্ড নম্বরটি তৈরি করতে দিন।
এডওয়ার্ড ব্রে

চমত্কার - স্থানীয় বিল্ডগুলির জন্য একটি ডিফল্ট সহ আমি যে ধরণের সমাধানের দরকার ছিল।
কলহ

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.