<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>c# 彙整 - 泰克哪裡去</title>
	<atom:link href="https://tech.uccu.website/tag/c/feed" rel="self" type="application/rss+xml" />
	<link>https://tech.uccu.website/tag/c</link>
	<description>一個科技相關的隨手記錄網站</description>
	<lastBuildDate>Sat, 17 Sep 2022 20:46:57 +0000</lastBuildDate>
	<language>zh-TW</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.1</generator>
<site xmlns="com-wordpress:feed-additions:1">119574712</site>	<item>
		<title>【2021鐵人賽】Pipeline與Artifacts應用：覆寫C#專案屬性資訊</title>
		<link>https://tech.uccu.website/2021ironman-day15-override-csproj-properties.html?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=2021ironman-day15-override-csproj-properties</link>
					<comments>https://tech.uccu.website/2021ironman-day15-override-csproj-properties.html#respond</comments>
		
		<dc:creator><![CDATA[鳴人]]></dc:creator>
		<pubDate>Mon, 27 Sep 2021 15:28:35 +0000</pubDate>
				<category><![CDATA[2021鐵人賽]]></category>
		<category><![CDATA[Azure DevOps]]></category>
		<category><![CDATA[iThome鐵人賽]]></category>
		<category><![CDATA[資訊科技]]></category>
		<category><![CDATA[2021ironman]]></category>
		<category><![CDATA[azure devops]]></category>
		<category><![CDATA[c#]]></category>
		<guid isPermaLink="false">https://tech.uccu.website/?p=989</guid>

					<description><![CDATA[<p>這篇文章內容除了提到如何透過Extension提供的Task來讀取與寫入csproj檔案內容之外，也提到了如何讓Pipeline在不同情況變更定義的變數(Variable)值，以便讓後續的Task在不同情況使用不同的變數值。</p>
<p>這篇文章 <a href="https://tech.uccu.website/2021ironman-day15-override-csproj-properties.html">【2021鐵人賽】Pipeline與Artifacts應用：覆寫C#專案屬性資訊</a> 最早出現於 <a href="https://tech.uccu.website">泰克哪裡去</a>。</p>
]]></description>
										<content:encoded><![CDATA[
<p>前面文章透過Pipeline上傳nuget package到Artifact feed的時候因為產生的版本已經在之前上傳過了，所以造成Pipeline最後執行失敗。為了要解決這個問題，希望能夠在Pipeline執行的時候自動覆寫版本的資訊，利用Pipeline的BuildId或BuildNumber來代表Package的版本，因此在<a href="https://tech.uccu.website/2021ironman-day14-extensions-for-azure-devops.html" target="_blank" rel="noreferrer noopener">前一篇文章</a>中也從Azure DevOps Extensions Marketplace中安裝了「<a href="https://marketplace.visualstudio.com/items?itemName=MatthewThomas.netstandard-project-property-tools" target="_blank" rel="noreferrer noopener">.Net Standard Project Property Reader and Writer</a>」這個Extension，這篇文章就讓我們用<a href="https://tech.uccu.website/2021ironman-day13-create-build-nuget-package-pipeline.html" target="_blank" rel="noreferrer noopener">先前文章中</a>失敗的Yaml檔內容來繼續吧！</p>



<pre class="wp-block-prismatic-blocks"><code class="language-yaml"># Starter pipeline
# Start with a minimal pipeline that you can customize to build and deploy your code.
# Add steps that build, run tests, deploy, and more:
# https://aka.ms/yaml

trigger:
- none

pool:
  vmImage: ubuntu-latest

steps:
- task: DotNetCoreCLI@2
  displayName: Build C# Project
  inputs:
    command: &#039;build&#039;
    projects: &#039;$(ProjectName)/*.csproj&#039;
    arguments: &#039;-o $(Build.BinariesDirectory)&#039;
- task: ArchiveFiles@2
  displayName: Zip output files
  inputs:
    rootFolderOrFile: &#039;$(Build.BinariesDirectory)&#039;
    includeRootFolder: false
    archiveType: &#039;zip&#039;
    archiveFile: &#039;$(Build.ArtifactStagingDirectory)/$(ProjectName)-$(Build.BuildId).zip&#039;
    replaceExistingArchive: true
- task: PublishPipelineArtifact@1
  displayName: Publish files to pipeline artifacts
  inputs:
    targetPath: &#039;$(Build.ArtifactStagingDirectory)&#039;
    artifact: &#039;BuildOutputFiles&#039;
    publishLocation: &#039;pipeline&#039;
- task: DotNetCoreCLI@2
  displayName: Push Nuget package
  inputs:
    command: &#039;push&#039;
    packagesToPush: &#039;$(Build.BinariesDirectory)/*.nupkg&#039;
    nuGetFeedType: &#039;internal&#039;
    publishVstsFeed: &#039;15523482-96ea-4d9f-83bf-a57fc10e79ce&#039;</code></pre>



<p>首先，我們先來看一下ModuleBase.csproj檔案的內容：</p>



<pre class="wp-block-prismatic-blocks"><code class="language-xml">&lt;Project Sdk=&quot;Microsoft.NET.Sdk&quot;&gt;

  &lt;PropertyGroup&gt;
    &lt;TargetFramework&gt;netcoreapp3.1&lt;/TargetFramework&gt;
    &lt;GeneratePackageOnBuild&gt;true&lt;/GeneratePackageOnBuild&gt;
    &lt;Version&gt;1.0.1&lt;/Version&gt;
  &lt;/PropertyGroup&gt;

&lt;/Project&gt;</code></pre>



<p>從上面的XML內容中可以看到版本是設定在Version這個名稱的節點；另外，前面文章中設定Build專案時順便產生nupkg的設定則是在GeneratePackageOnBuild這個節點中設定為true。</p>



<p>接下來我們從Task清單中找到PowerShell task：</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img data-recalc-dims="1" decoding="async" width="352" height="61" src="https://i0.wp.com/storage.googleapis.com/stateless-tech-uccu-website/2021/09/73a315f3-task-powershell.png?resize=352%2C61&#038;ssl=1" alt="" class="wp-image-1004" srcset="https://i0.wp.com/storage.googleapis.com/stateless-tech-uccu-website/2021/09/73a315f3-task-powershell.png?w=352&amp;ssl=1 352w, https://i0.wp.com/storage.googleapis.com/stateless-tech-uccu-website/2021/09/73a315f3-task-powershell.png?resize=300%2C52&amp;ssl=1 300w" sizes="(max-width: 352px) 100vw, 352px" /></figure></div>



<p>在Type的部份選擇Inline，接著在Script的內容部份輸入cat $(ProjectName)/$(ProjectName).csproj，將csproj檔案內容在Pipeline一開始執行的時候先輸出一份，所以這個task將會插入到steps下面作為第一個task：</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img data-recalc-dims="1" fetchpriority="high" decoding="async" width="346" height="368" src="https://i0.wp.com/storage.googleapis.com/stateless-tech-uccu-website/2021/09/69befc71-task-powershell-catcsproj.png?resize=346%2C368&#038;ssl=1" alt="" class="wp-image-1007" srcset="https://i0.wp.com/storage.googleapis.com/stateless-tech-uccu-website/2021/09/69befc71-task-powershell-catcsproj.png?w=346&amp;ssl=1 346w, https://i0.wp.com/storage.googleapis.com/stateless-tech-uccu-website/2021/09/69befc71-task-powershell-catcsproj.png?resize=282%2C300&amp;ssl=1 282w" sizes="(max-width: 346px) 100vw, 346px" /></figure></div>



<p>這樣做的原因是可以在修改Version的前後看到檔案內容的差異，也算是一種log的方式。</p>



<p>接下來從Task清單中找到下面這個Project Property To Environment Variable task：</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img data-recalc-dims="1" decoding="async" width="326" height="58" src="https://i0.wp.com/storage.googleapis.com/stateless-tech-uccu-website/2021/09/eba66138-task-projectvarreader.png?resize=326%2C58&#038;ssl=1" alt="" class="wp-image-1010" srcset="https://i0.wp.com/storage.googleapis.com/stateless-tech-uccu-website/2021/09/eba66138-task-projectvarreader.png?w=326&amp;ssl=1 326w, https://i0.wp.com/storage.googleapis.com/stateless-tech-uccu-website/2021/09/eba66138-task-projectvarreader.png?resize=300%2C53&amp;ssl=1 300w" sizes="(max-width: 326px) 100vw, 326px" /><figcaption>Project Var Reader task</figcaption></figure></div>



<p>第一個Path to csproj/vbproj file的屬性設定同樣設為$(ProjectName)/$(ProjectName).csproj，第二個Variable Prefix設為Proj，第三個則是選擇Version選項：</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="329" height="299" src="https://i0.wp.com/storage.googleapis.com/stateless-tech-uccu-website/2021/09/30a32090-task-projectvarreader-readversion.png?resize=329%2C299&#038;ssl=1" alt="" class="wp-image-1013" srcset="https://i0.wp.com/storage.googleapis.com/stateless-tech-uccu-website/2021/09/30a32090-task-projectvarreader-readversion.png?w=329&amp;ssl=1 329w, https://i0.wp.com/storage.googleapis.com/stateless-tech-uccu-website/2021/09/30a32090-task-projectvarreader-readversion.png?resize=300%2C273&amp;ssl=1 300w" sizes="auto, (max-width: 329px) 100vw, 329px" /><figcaption>Project Var Reader settings</figcaption></figure></div>



<p>上面Task的設定會將csproj檔案中的Version內容讀取出來之後放在$(Proj.Version)裡面，以便後續使用。</p>



<p>讀取了Version資訊之後，再從Task清單中找到Write Project Property這個Task：</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="306" height="45" src="https://i0.wp.com/storage.googleapis.com/stateless-tech-uccu-website/2021/09/e17145d8-task-projectvarwriter.png?resize=306%2C45&#038;ssl=1" alt="" class="wp-image-1016" srcset="https://i0.wp.com/storage.googleapis.com/stateless-tech-uccu-website/2021/09/e17145d8-task-projectvarwriter.png?w=306&amp;ssl=1 306w, https://i0.wp.com/storage.googleapis.com/stateless-tech-uccu-website/2021/09/e17145d8-task-projectvarwriter.png?resize=300%2C44&amp;ssl=1 300w" sizes="auto, (max-width: 306px) 100vw, 306px" /><figcaption>Project Var Writer</figcaption></figure></div>



<p>對照上面讀取Version內容的Task設定，唯一不同的地方是第二個屬性設為$(Proj.Version).$(Build.BuildId)，也就是將剛才讀出來的Version資訊後面加上Pipeline的BuildId，這樣每次執行Pipeline所產生的檔案版本就會不同：</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="333" height="283" src="https://i0.wp.com/storage.googleapis.com/stateless-tech-uccu-website/2021/09/f0798f3f-task-projectvarwriter-writeversion.png?resize=333%2C283&#038;ssl=1" alt="" class="wp-image-1019" srcset="https://i0.wp.com/storage.googleapis.com/stateless-tech-uccu-website/2021/09/f0798f3f-task-projectvarwriter-writeversion.png?w=333&amp;ssl=1 333w, https://i0.wp.com/storage.googleapis.com/stateless-tech-uccu-website/2021/09/f0798f3f-task-projectvarwriter-writeversion.png?resize=300%2C255&amp;ssl=1 300w" sizes="auto, (max-width: 333px) 100vw, 333px" /><figcaption>Project Var Writer settings</figcaption></figure></div>



<p>之後再將前面的PowerShell task複製一份插入在ProjectVarWriter task後面，這樣就可以查看寫入之後的內容是什麼。</p>



<p>另外，這個Extension的Task只能執行在Windows環境的Agent，所以還必須要將上面的vmImage設定改為windows-latest，最後完成的Yaml內容如下：</p>



<pre class="wp-block-prismatic-blocks"><code class="language-yaml"># Starter pipeline
# Start with a minimal pipeline that you can customize to build and deploy your code.
# Add steps that build, run tests, deploy, and more:
# https://aka.ms/yaml

trigger:
- none

pool:
  vmImage: windows-latest

steps:
- task: PowerShell@2
  displayName: Print csproj content
  inputs:
    targetType: &#039;inline&#039;
    script: &#039;cat $(ProjectName)/$(ProjectName).csproj&#039;
- task: ProjectVarReader@0
  displayName: Read version value
  inputs:
    searchPattern: &#039;$(ProjectName)/$(ProjectName).csproj&#039;
    variablePrefix: &#039;Proj&#039;
    propertyName: &#039;Version&#039;
- task: ProjectVarWriter@0
  displayName: Writer version value
  inputs:
    searchPattern: &#039;$(ProjectName)/$(ProjectName).csproj&#039;
    value: &#039;$(Proj.Version).$(Build.BuildId)&#039;
    propertyName: &#039;Version&#039;
- task: PowerShell@2
  displayName: Print csproj content
  inputs:
    targetType: &#039;inline&#039;
    script: &#039;cat $(ProjectName)/$(ProjectName).csproj&#039;
- task: DotNetCoreCLI@2
  displayName: Build C# Project
  inputs:
    command: &#039;build&#039;
    projects: &#039;$(ProjectName)/$(ProjectName).csproj&#039;
    arguments: &#039;-o $(Build.BinariesDirectory)&#039;
- task: ArchiveFiles@2
  displayName: Zip output files
  inputs:
    rootFolderOrFile: &#039;$(Build.BinariesDirectory)&#039;
    includeRootFolder: false
    archiveType: &#039;zip&#039;
    archiveFile: &#039;$(Build.ArtifactStagingDirectory)/$(ProjectName)-$(Build.BuildId).zip&#039;
    replaceExistingArchive: true
- task: PublishPipelineArtifact@1
  displayName: Publish files to pipeline artifacts
  inputs:
    targetPath: &#039;$(Build.ArtifactStagingDirectory)&#039;
    artifact: &#039;BuildOutputFiles&#039;
    publishLocation: &#039;pipeline&#039;
- task: DotNetCoreCLI@2
  displayName: Push Nuget package
  inputs:
    command: &#039;push&#039;
    packagesToPush: &#039;$(Build.BinariesDirectory)/*.nupkg&#039;
    nuGetFeedType: &#039;internal&#039;
    publishVstsFeed: &#039;15523482-96ea-4d9f-83bf-a57fc10e79ce&#039;</code></pre>



<p>從Pipeline執行的log可以看到第一個PowerShell task log中的Version和第二個PowerShell task log中的Version不同，第二個印出的Version值是1.0.1.31：</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="877" height="433" src="https://i0.wp.com/storage.googleapis.com/stateless-tech-uccu-website/2021/09/2dc41cd9-jobs-powershellcatcsprojcontent1.png?resize=877%2C433&#038;ssl=1" alt="" class="wp-image-1022" srcset="https://i0.wp.com/storage.googleapis.com/stateless-tech-uccu-website/2021/09/2dc41cd9-jobs-powershellcatcsprojcontent1.png?w=877&amp;ssl=1 877w, https://i0.wp.com/storage.googleapis.com/stateless-tech-uccu-website/2021/09/2dc41cd9-jobs-powershellcatcsprojcontent1.png?resize=300%2C148&amp;ssl=1 300w, https://i0.wp.com/storage.googleapis.com/stateless-tech-uccu-website/2021/09/2dc41cd9-jobs-powershellcatcsprojcontent1.png?resize=768%2C379&amp;ssl=1 768w" sizes="auto, (max-width: 877px) 100vw, 877px" /></figure></div>



<div class="wp-block-image"><figure class="aligncenter size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="850" height="398" src="https://i0.wp.com/storage.googleapis.com/stateless-tech-uccu-website/2021/09/9656ef41-jobs-powershellcatcsprojcontent2.png?resize=850%2C398&#038;ssl=1" alt="" class="wp-image-1025" srcset="https://i0.wp.com/storage.googleapis.com/stateless-tech-uccu-website/2021/09/9656ef41-jobs-powershellcatcsprojcontent2.png?w=850&amp;ssl=1 850w, https://i0.wp.com/storage.googleapis.com/stateless-tech-uccu-website/2021/09/9656ef41-jobs-powershellcatcsprojcontent2.png?resize=300%2C140&amp;ssl=1 300w, https://i0.wp.com/storage.googleapis.com/stateless-tech-uccu-website/2021/09/9656ef41-jobs-powershellcatcsprojcontent2.png?resize=768%2C360&amp;ssl=1 768w" sizes="auto, (max-width: 850px) 100vw, 850px" /></figure></div>



<p>從Artifact feed(Private nuget)中也可以看到1.0.1.31的版本：</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="372" height="247" src="https://i0.wp.com/storage.googleapis.com/stateless-tech-uccu-website/2021/09/2834a87d-packages-modulebase-listversions.png?resize=372%2C247&#038;ssl=1" alt="" class="wp-image-1028" srcset="https://i0.wp.com/storage.googleapis.com/stateless-tech-uccu-website/2021/09/2834a87d-packages-modulebase-listversions.png?w=372&amp;ssl=1 372w, https://i0.wp.com/storage.googleapis.com/stateless-tech-uccu-website/2021/09/2834a87d-packages-modulebase-listversions.png?resize=300%2C199&amp;ssl=1 300w" sizes="auto, (max-width: 372px) 100vw, 372px" /></figure></div>



<p>從下面的下拉選單中可以看到GeneratePackageOnBuild也在選項中，所以也可以透過這個方式從Pipeline中設定GeneratePackageOnBuild=true，因為預設建立的C# Project設定中是沒有特別設定這個選項：</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="324" height="351" src="https://i0.wp.com/storage.googleapis.com/stateless-tech-uccu-website/2021/09/22e391f2-tasksettings-projectvarreaderwritersupportproperties.png?resize=324%2C351&#038;ssl=1" alt="" class="wp-image-1031" srcset="https://i0.wp.com/storage.googleapis.com/stateless-tech-uccu-website/2021/09/22e391f2-tasksettings-projectvarreaderwritersupportproperties.png?w=324&amp;ssl=1 324w, https://i0.wp.com/storage.googleapis.com/stateless-tech-uccu-website/2021/09/22e391f2-tasksettings-projectvarreaderwritersupportproperties.png?resize=277%2C300&amp;ssl=1 277w" sizes="auto, (max-width: 324px) 100vw, 324px" /></figure></div>



<p>除此之外，還有一個Custom的選項，可以自行填入要設定的Property name，可以透過這個方式設定Authors、Description這些屬性，因為在nuget package的也會使用到這些屬性值，也可以將這些設為Variable讓執行Pipeline的使用者輸入這些內容。實際上的作法則是要看團隊的習慣，不過一般來說這些不太會變動的內容應該也是要寫在C#專案設定中才對。</p>



<p>上面的步驟在C# Project檔案中已經有設定了Version值的情況下並不會有什麼問題，但是一般新建立的專案沒有特別去設定版本號的話，其實csproj裡面是不會有Version的內容的，也就是若沒有設定Version值的時候在Build時候系統會預設為1.0.0，但是…</p>



<p>上面的Task在讀取Version內容的時候實際上因為Version並不在檔案內容中，所以在Proj.Version中將會是空的！</p>



<p>這下慘了…那寫入的Version不就變成「.31」這樣的內容？這是什麼奇怪的版本號碼格式…</p>



<p>為了避免這樣的問題，所以要設定另外一個預設值變數，在Yaml中的steps前面加入下面這段：</p>



<pre class="wp-block-prismatic-blocks"><code class="language-yaml">variables:
  version: &#039;$(Proj.Version).$(Build.BuildId)&#039;
  predefined_version: &#039;1.0.0.$(Build.BuildId)&#039;</code></pre>



<p>增加了version、predefined_version兩個變數，並且將寫入Version值的那個Task設定中的value屬性從&#8217;$(Proj.Version).$(Build.BuildId)&#8217;改為&#8217;$(version)&#8217;。</p>



<p>接下來要做的是判斷ProjectVarReader讀取到的Version值是不是空的，也就是判斷Proj.Version的內容是不是空的，如果是空的，那麼就把predefined_version變數的內容設定到version變數中，這部份使用到的還是PowerShell task，yaml內容如下(插入在Writer之前)：</p>



<pre class="wp-block-prismatic-blocks"><code class="language-yaml">- task: PowerShell@2
  displayName: Check version value
  inputs:
    targetType: &#039;inline&#039;
    script: |
      echo &quot;Proj.Version = $env:Proj_Version&quot;
      if ([string]::IsNullOrWhiteSpace($env:Proj_Version))
      {
        echo &#039;##vso[task.setvariable variable=version]$(predefined_version)&#039;
      }</code></pre>



<p>這邊要特別提的就是在Pipeline中根據不同情況設定variable內容的技巧，也就是透過PowerShell的echo輸出特別的字串格式「<strong><em>##vso[task.setvariable variable=變數名稱]設定值</em></strong>」，變數名稱就是在variables裡面設定的變數，設定值的部份則是可以使用「$(變數名稱)」再從別的變數中取得值，透過這個方式就可以將version這個變數內容更改為predefined_version所設定的內容。(註：在PowerShell中是透過環境變數來取得設定的變數值，並且點( . )會取代為底線( _ )，詳細資訊可<a href="https://docs.microsoft.com/en-us/azure/devops/pipelines/process/variables?view=azure-devops&amp;tabs=yaml%2Cbatch#access-variables-through-the-environment" target="_blank" rel="noreferrer noopener">參考官方文件</a>。)</p>



<p>最後完成的Yaml檔內容：</p>



<pre class="wp-block-prismatic-blocks"><code class="language-yaml"># Starter pipeline
# Start with a minimal pipeline that you can customize to build and deploy your code.
# Add steps that build, run tests, deploy, and more:
# https://aka.ms/yaml

trigger:
- none

pool:
  vmImage: windows-latest

variables:
  version: &#039;$(Proj.Version).$(Build.BuildId)&#039;
  predefined_version: &#039;1.0.0.$(Build.BuildId)&#039;

steps:
- task: PowerShell@2
  displayName: Print csproj content
  inputs:
    targetType: &#039;inline&#039;
    script: &#039;cat $(ProjectName)/$(ProjectName).csproj&#039;
- task: ProjectVarReader@0
  displayName: Read version value
  inputs:
    searchPattern: &#039;$(ProjectName)/$(ProjectName).csproj&#039;
    variablePrefix: &#039;Proj&#039;
    propertyName: &#039;Version&#039;
- task: PowerShell@2
  displayName: Check version value
  inputs:
    targetType: &#039;inline&#039;
    script: |
      echo &quot;Proj.Version = $env:Proj_Version&quot;
      if ([string]::IsNullOrWhiteSpace($env:Proj_Version))
      {
        echo &#039;##vso[task.setvariable variable=version]$(predefined_version)&#039;
      }
- task: ProjectVarWriter@0
  displayName: Writer version value
  inputs:
    searchPattern: &#039;$(ProjectName)/$(ProjectName).csproj&#039;
    value: &#039;$(version)&#039;
    propertyName: &#039;Version&#039;
- task: ProjectVarWriter@0
  displayName: Set GeneratePackageOnBuild = true
  inputs:
    searchPattern: &#039;$(ProjectName)/$(ProjectName).csproj&#039;
    value: &#039;true&#039;
    propertyName: &#039;GeneratePackageOnBuild&#039;
- task: PowerShell@2
  displayName: Print csproj content
  inputs:
    targetType: &#039;inline&#039;
    script: &#039;cat $(ProjectName)/$(ProjectName).csproj&#039;
- task: DotNetCoreCLI@2
  displayName: Build C# Project
  inputs:
    command: &#039;build&#039;
    projects: &#039;$(ProjectName)/$(ProjectName).csproj&#039;
    arguments: &#039;-o $(Build.BinariesDirectory)&#039;
- task: ArchiveFiles@2
  displayName: Zip output files
  inputs:
    rootFolderOrFile: &#039;$(Build.BinariesDirectory)&#039;
    includeRootFolder: false
    archiveType: &#039;zip&#039;
    archiveFile: &#039;$(Build.ArtifactStagingDirectory)/$(ProjectName)-$(Build.BuildId).zip&#039;
    replaceExistingArchive: true
- task: PublishPipelineArtifact@1
  displayName: Publish files to pipeline artifacts
  inputs:
    targetPath: &#039;$(Build.ArtifactStagingDirectory)&#039;
    artifact: &#039;BuildOutputFiles&#039;
    publishLocation: &#039;pipeline&#039;
- task: DotNetCoreCLI@2
  displayName: Push Nuget package
  inputs:
    command: &#039;push&#039;
    packagesToPush: &#039;$(Build.BinariesDirectory)/*.nupkg&#039;
    nuGetFeedType: &#039;internal&#039;
    publishVstsFeed: &#039;15523482-96ea-4d9f-83bf-a57fc10e79ce&#039;</code></pre>
<p>這篇文章 <a href="https://tech.uccu.website/2021ironman-day15-override-csproj-properties.html">【2021鐵人賽】Pipeline與Artifacts應用：覆寫C#專案屬性資訊</a> 最早出現於 <a href="https://tech.uccu.website">泰克哪裡去</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://tech.uccu.website/2021ironman-day15-override-csproj-properties.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">989</post-id>	</item>
	</channel>
</rss>
