FxCop рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ .NET рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд╛рдпрдирд╛рдорд┐рдХ рд░реВрдк рд╕реЗ рдПрдХ рдмрд┐рд▓реНрдб рдкреНрд▓рд╛рди рдмрдирд╛ рд░рд╣рд╛ рд╣реИ


рдРрд╕рд╛ рд╣реБрдЖ рдХрд┐ рдПрдХ рд╕рд╛рд▓ рдкрд╣рд▓реЗ, рдореБрдЭреЗ рдЪреАрдВрдЯреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдмрд┐рд▓реНрдб рдкреНрд▓рд╛рди рд▓рд┐рдЦрдирд╛ рдкрдбрд╝рд╛ред рдпрд╣ рд╣рдорд╛рд░реА рдЫреЛрдЯреА рд╡реЗрдм рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдЗрд░рд╛рджрд╛ рдерд╛, рд╣рдбрд╕рди рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдЙрддреНрдкрд╛рджрди рдХрд░рдирд╛ рдерд╛: рд╕рдВрдХрд▓рди, NUnit рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдирд╛, рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХрд╛% рдХрд╡рд░реЗрдЬ рдЧрд┐рдирдирд╛, рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХреЛрдб рдвреВрдВрдврдирд╛ рдФрд░ рдХреЛрдб рдореЗрдВ рдореБрдЦреНрдп рд╢реИрд▓реАрдЧрдд рд╡рд┐рд╕рдВрдЧрддрд┐рдпреЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдирд╛ред рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рд╢реБрд░реВрдЖрдд рд╣реИ, рдФрд░ рдлрд┐рд░ рд╣рдо FxCop рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд┐рд▓реНрдб рдкреНрд▓рд╛рди рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред

рдФрд░ рдЗрд╕рд▓рд┐рдП! рдЪрд▓реЛ рдЪрд▓рддреЗ рд╣реИрдВ!



рдкреГрд╖реНрдарднреВрдорд┐



рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдореИрдВрдиреЗ рдмрд┐рд▓реНрдб рдкреНрд▓рд╛рди рдХреЛ рдХрдИ рдШрдЯрдХреЛрдВ рдореЗрдВ рддреЛрдбрд╝ рджрд┐рдпрд╛:

  1. dbdeploy.build.xml - рдПрдХ рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛рдмреЗрд╕ рдмрдирд╛рдиреЗ рдФрд░ рджрд┐рдЦрдиреЗ рд╡рд╛рд▓реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд░реЛрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ
  2. fxcop.build.xml - рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА FxCop рджреНрд╡рд╛рд░рд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдФрд░ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╢реБрд░реВ рдХрд░рдиреЗ рдФрд░ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд░рд┐рдкреЛрд░реНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ
  3. main.build.xml - рдпрд╣рд╛рдБ рдореБрдЦреНрдп рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХреЛ рднрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЙрдирдХреА рдЕрд╕реЗрдВрдмрд▓реА рдХреЗ рд▓рд┐рдП рд╕реНрд▓рд╛рдЗрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЦреЛрдЬрддреЗ рд╣реИрдВ
  4. ncover.build.xml - рдЗрд╕ рднрд╛рдЧ рдореЗрдВ, рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рдХреЛрдб рдХреЗ рдХрд╡рд░реЗрдЬ рдкрд░ рдПрдХ рд░рд┐рдкреЛрд░реНрдЯ рдмрдирд╛рдИ рдЧрдИ рд╣реИ
  5. simian.build.xml - рдФрд░ рдпрд╣рд╛рдБ рдХреЛрдб рдореЗрдВ рджреЛрд╣рд░рд╛рд╡ рдкрд░ рд░рд┐рдкреЛрд░реНрдЯ рд╣реИред
  6. test.build.xml - рдареАрдХ рд╣реИ, рддреЛ рдпрд╣ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╕рднреА NUnit рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреА рдЦреЛрдЬ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ


рдЗрд╕ рддрд░рд╣ рдХрд╛ рдПрдХ рдореЙрдбреНрдпреВрд▓рд░ рдирд┐рд░реНрдорд╛рдг рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЬрд┐рдореНрдореЗрджрд╛рд░рд┐рдпреЛрдВ рд╕реЗ рдЕрд▓рдЧ, рд╡реНрдпрдХреНрддрд┐рдЧрдд рднрд╛рдЧреЛрдВ рдХреЛ рдмрд╛рд╣рд░ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИред рдЖрдкрдХреЗ рдФрд░ рдореЗрд░реЗ рд▓рд┐рдП, рдбрд┐рд╡рд╛рдЗрд╕ fxcop.build.xml рдлрд╝рд╛рдЗрд▓ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЖрдкрдХреЗ рдКрдкрд░ рд╣реИред

рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ



рдкрд╣рд▓реЗ рддреЛ рдореИрдВрдиреЗ рдЯреНрд░рд╛рдВрд╕рдлрд╝рд░ рдХреА рдЧрдИ рдлрд╛рдЗрд▓реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА, рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЯреНрд░рд╛рдВрд╕рдлрд╝рд░ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдЕрднреНрдпрд╛рд╕ рд╕реЗ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ, рдпрд╣ рдПрдХ рдиреАрд░рд╕ рдФрд░ рд▓рдВрдмреА рдХрд╕рд░рдд рд╣реИред рдФрд░ рдпрд╣ рдмрд╣реБрдд рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдирд╣реАрдВ рд╣реИ, рдЪреВрдВрдХрд┐ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддреЗ рд╕рдордп, рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рд╕реВрдЪреА рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛ред рдлрд┐рд░ рдореИрдВрдиреЗ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рд╕реВрдЪреА рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдмрдирд╛рдиреЗ рдФрд░ рдЪреАрдВрдЯреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ FxCop рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХреА рддрд▓рд╛рд╢ рд╢реБрд░реВ рдХрд░ рджреАред рдЪреВрдВрдХрд┐ рдмрд╣реБрдд рд╕рд╛рд░реА рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреА рдЧрдИ рдлрд╛рдЗрд▓реЗрдВ рдереАрдВ, рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ FxCop рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдХреБрд▓ рдПрдХ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкреНрд░рдгрд╛рд▓реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдЕрдлрд╡рд╛рд╣ рдлреИрд▓рд╛рдирд╛ рдФрд░ рдЪреАрдВрдЯреА-рдХреЙрдиреНрдЯреНрд░рд┐рдм рдФрд░ рдЪреАрдВрдЯреА рдХрдорд╛рдВрдб рдкрд░ рдореИрдиреБрдЕрд▓ рдкрдврд╝рдирд╛, рдореБрдЭреЗ рд╡рд╣реА рдорд┐рд▓рд╛ рдЬреЛ рдореБрдЭреЗ рдЪрд╛рд╣рд┐рдП рдерд╛ред рдпрд╣ рд╕рдмрдВрдЯ рдЯреАрдо рдереА рдЬрд┐рд╕рдиреЗ рд╣рдореЗрдВ рдЕрдкрдирд╛ рд▓рдХреНрд╖реНрдп рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреАред рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдиреАрдЪреЗ!

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рдлрд╝рд╛рдЗрд▓ рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдЗрд╕рдореЗрдВ рдХрдИ рдХрд╛рд░реНрдп рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:



рдЕрдЧрд▓рд╛, рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореВрд▓ рдЕрдкрд╛рдЪреЗ рдЪреАрдВрдЯреА рдХрдорд╛рдВрдб рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

basename - рдЖрдкрдХреЛ рдкреВрд░реНрдг рдкрде рд╕реЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд╕рд╛рде рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
loadfile - рдЖрдкрдХреЛ рдХрд┐рд╕реА рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдХреБрдЫ рдбреЗрдЯрд╛ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдХрд╛рд░реНрдп .NET рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлрд╝рд╛рдЗрд▓ рдХреЗ proj рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╕рдмрдВрдЯ - рдЖрдкрдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдмрд┐рд▓реНрдб рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ FxCop рдХреЗ рд▓рд┐рдП рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ
Propertyregex - рдЖрдкрдХреЛ рдЗрдирдкреБрдЯ рд▓рд╛рдЗрди рдкрд░ рджрд┐рдП рдЧрдП рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбреЗрдЯрд╛ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдпрджрд┐ - рдмрд┐рд▓реНрдб рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рддрд╛рд░реНрдХрд┐рдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рддрд░реНрдХ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдЕрдм рдЖрдк рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдп рдкрд░ рдЕрд▓рдЧ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред

рд▓рд┐рдЦрдиреЗ-рд╕рд┐рд░-рднрд╛рдЧ


<target name="write-head-part"> <echo file="${dynafile.path}\${dynafilename}">&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;project name="dyna-fxcop-build" default="run-fx-cop-report-creation" basedir="."&gt; &lt;target name="run-fx-cop-report-creation"&gt; &lt;exec executable="${fxcop.path}\FxCopCmd.exe" failonerror="false"&gt;</echo> </target> 


рдЗрд╕ рдХрд╛рд░реНрдп рдореЗрдВ, рдмрд┐рд▓реНрдб рдкреНрд▓рд╛рди рдХреЗ рдорд╛рдирдХ рд╣реЗрдбрд░ ${dynafile.path}\${dynafilename} , рдкрде рдкрд░ рд╕реНрдерд┐рдд рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ &lt; &gt; &lt; &gt; , рдкрд╛рддреНрд░реЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП < > ред рдпрд╣ рдПрдлрдПрдХреНрд╕рдХреЛрдк рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП exec рдХрд╛рд░реНрдп рдХреЛ рднреА рд░рд┐рдХреЙрд░реНрдб рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣, arg рдорд╛рдзреНрдпрдо рд╕реЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкрд╛рд░ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреА рдЧрдИ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рд░рд╛рд╕реНрддреЛрдВ рдХреА рдПрдХ рд▓рдВрдмреА рд╕реВрдЪреА рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

create-рддрд░реНрдХреЛрдВ


  <target name="create-arguments"> //        <echo message="${item.file}"/> //    ,     filename <basename property="filename" file="${item.file}"/> //   output.path   <OutputPath>   csproj <loadfile srcfile="${item.file}" property="output.path"> <filterchain> <linecontains> <contains value="&lt;OutputPath&gt;"/> </linecontains> </filterchain> </loadfile> //   <OutputType>   csproj   output.type <loadfile srcfile="${item.file}" property="output.type"> <filterchain> <linecontains> <contains value="&lt;OutputType&gt;"/> </linecontains> </filterchain> </loadfile> //   <AssemblyName>   csproj   assembly.name <loadfile srcfile="${item.file}" property="assembly.name"> <filterchain> <linecontains> <contains value="&lt;AssemblyName&gt;"/> </linecontains> </filterchain> </loadfile> //       OutputPath    output.path.info <propertyregex property="output.path.info" input="${output.path}" regexp="&lt;OutputPath&gt;(.*?)&lt;/OutputPath&gt;" select="\1" /> //       OutputType    output.type.info <propertyregex property="output.type.info" input="${output.type}" regexp="&lt;OutputType&gt;(.*?)&lt;/OutputType&gt;" select="\1" /> //       AssemblyName    assembly.name.info <propertyregex property="assembly.name.info" input="${assembly.name}" regexp="&lt;AssemblyName&gt;(.*?)&lt;/AssemblyName&gt;" select="\1" /> //       <propertyregex property="item.path" input="${item.file}" regexp="(.*)\\" select="\1" /> <echo message="output.type.info = ${output.type.info}"/> <echo message="output.path = ${output.path}"/> //         output.type.info <if> <contains string="WinExe" substring="${output.type.info}"/> <then> <property name="file.name.ext" value="${assembly.name.info}.exe"/> </then> <elseif> <contains string="Exe" substring="${output.type.info}"/> <then> <property name="file.name.ext" value="${assembly.name.info}.exe"/> </then> </elseif> <else> <property name="file.name.ext" value="${assembly.name.info}.dll"/> </else> </if> //  <arg value=""/>    value      . <echo file="${dynafile.path}\${dynafilename}" append="true"> &lt;arg value="/f:${item.path}\${output.path.info}${file.name.ext}"/&gt; </echo> </target> 


рдЗрд╕ рдХрд╛рд░реНрдп рдореЗрдВ, рдПрдХреНрд╕рдЯреЗрдВрд╢рди csproj рдХреЗ рд╕рд╛рде рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдлрд╝рд╛рдЗрд▓ рд╕реЗ, рдЯреИрдЧ рдбреЗрдЯрд╛ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: OutputPath, OutputType рдФрд░ AssemblyNameред рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рддрд╛рдХрд┐ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдирд╛рдо рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ (рдХреНрдпреЛрдВрдХрд┐ рдРрд╕реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдлрд╛рдЗрд▓реЗрдВ рдереАрдВ рдЬрд┐рдирдореЗрдВ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХрд╛ рдирд╛рдо рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛)ред рдФрд░ рдмрд┐рд▓реНрдб рдпреЛрдЬрдирд╛ рдХреА рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдмрдирд╛рдИ рдЧрдИ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП arg рд▓рд╛рдЗрдиреЗрдВ / f: рдзреНрд╡рдЬ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреЗ рд╕рд╛рде рд▓рд┐рдЦреА рдЧрдИ рд╣реИрдВред

рд▓рд┐рдЦрдиреЗ-рдкрд╛рдж-рднрд╛рдЧ


 <target name="write-footer-part"> <echo file="${dynafile.path}\${dynafilename}" append="true"> &lt;arg value="/r:${fxcop.path}\Rules"/&gt; &lt;arg value="/o:${fxcop.report.full.path}"/&gt; &lt;/exec&gt; &lt;/target&gt; &lt;/project&gt;</echo> </target> 


рдпрд╣ рдХрд╛рд░реНрдп рдбрд╛рдпрдиреЗрдорд┐рдХ рд░реВрдк рд╕реЗ рдирд┐рд░реНрдорд┐рдд рдмрд┐рд▓реНрдб рдкреНрд▓рд╛рди рдХреЗ рдЕрдВрддрд┐рдо рднрд╛рдЧ рдХреЛ рд░рд┐рдХреЙрд░реНрдб рдХрд░рддрд╛ рд╣реИ, рдЬреЛ FxCop рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдирд┐рдпрдорд╛рд╡рд▓реА рдлреЛрд▓реНрдбрд░ /r:${fxcop.path}\Rules рдФрд░ рд░рд┐рдкреЛрд░реНрдЯ рдЖрдЙрдЯрдкреБрдЯ рдлреЛрд▓реНрдбрд░ / /o:${fxcop.report.full.path} ред exec , traget рдФрд░ project рд╕рдорд╛рдкрди рдЯреИрдЧ рднреА traget ред

рд░рди-FxCop


 <target name="run-fxcop"> //   - <antcall target="write-head-part"/> //        <echo file="${dynafile.path}\${dynafilename}" append="true"> </echo> <var name="dll.names" value=""/> //  csproj    ,     ,    item.file, //  create-arguments <foreach target="create-arguments" param="item.file" inheritall="true"> <fileset dir="${basedir}" casesensitive="no"> <include name="**/*.csproj"/> //      /obj/Debug/ <exclude name="**/obj/Debug/**.*"/> </fileset> </foreach> //    - <antcall target="write-footer-part"/> //     -. <subant target="run-fx-cop-report-creation"> <fileset dir="${dynafile.path}" includes="${dynafilename}"/> </subant> </target> 


рдареАрдХ рд╣реИ, FxCop рдмрд┐рд▓реНрдб рдкреНрд▓рд╛рди рдХрд╛ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрд╛рд░реНрдп рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдмрдирд╛рдирд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдПрдХ рд╕рдм рдмрд┐рд▓реНрдб рдкреНрд▓рд╛рдиред рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, .NET рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕ рдХрд╛рд░реНрдп рдореЗрдВ, рд░рд╛рдЗрдЯ-рд╣реЗрдб-рдкрд╛рд░реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣реЗрдбрд░ ${dynafile.path}\${dynafilename} рдкрде рдХреЗ рд╕рд╛рде рдмрдирд╛рдИ рдЧрдИ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдЧрд▓рд╛, рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЕрдВрдд рдореЗрдВ рдбреЗрдЯрд╛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдореЛрдб рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, append="true" рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдЗрдХреЛ рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдПред

рдЗрди рдЪрд░рдгреЛрдВ рдХреЗ рдмрд╛рдж, рдлрд╝реЙрд░реНрдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП csproj рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд╕рд╛рде рдлрд╝рд╛рдЗрд▓реЛрдВ рдкрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпрд╛рдВ рд╣реЛрддреА рд╣реИрдВред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдкрде рдЪрд░ item.file рдХреЛ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ param="item.file" рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдареАрдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХрд┐ рдЪреАрдВрдЯреА obj / Debug рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдирд╣реАрдВ рджреЗрдЦрддреА рд╣реИ, /> рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдЗрд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд░ рджреЗрддреЗ рд╣реИрдВред

рдлрд┐рд░, write-footer-part рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдирд┐рд░реНрдорд┐рдд рдмрд┐рд▓реНрдб рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЕрдВрддрд┐рдо рднрд╛рдЧ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдФрд░ рдЕрдм рдордЬрд╝рд╛ рд╣рд┐рд╕реНрд╕рд╛! рдЪреВрдВрдХрд┐ рд╣рдордиреЗ рдПрдХ рдЧрддрд┐рд╢реАрд▓ рдмрд┐рд▓реНрдб рдкреНрд▓рд╛рди рдореЗрдВ run-fx-cop-report-creation рдирд╛рдордХ рдПрдХ рдЯрд╛рд╕реНрдХ рдмрдирд╛рдпрд╛, рдЕрдм рд╣рдо рдЗрд╕реЗ рд╕рдмрдВрдЯ рдЯрд╛рд╕реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХреЛрдВ рдореЗрдВ, рдирд┐рд░реНрдорд╛рдг рдпреЛрдЬрдирд╛ рдХреА рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдкрде рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ run-fx-cop-report-creation рдХрд╛рд░реНрдп рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдирд┐рд╖реНрдХрд░реНрд╖



рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рд╛рдордЧреНрд░реА рджрд┐рд▓рдЪрд╕реНрдк рдереА :) рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

рдкреВрд░реНрдг xml FxCop рдХреЗ рд▓рд┐рдП рдлрд╝рд╛рдЗрд▓ рдХреЛрдб рдмрдирд╛рдПрдБ
 <?xml version="1.0" encoding="UTF-8"?> <project name="fxcop-xxx-project" default="run-fxcop" basedir="."> <property name="dynafile.path" value="${basedir}"/> <property name="dynafilename" value="dynabuild.xml"/> <property name="fxcop.report.dir" value="${basedir}\FxCopReports"/> <property name="fxcop.report.full.path" value="${fxcop.report.dir}\fxcop.report.xml"/> <target name="clean-fxcop-result-folder"> <echo message="Cleaning FxCop result report dir, and dynamic xml"/> <delete> <fileset dir="${fxcop.report.dir}" includes="**/*.*"/> </delete> <delete file="${dynafile.path}\${dynafilename}" failonerror="false"/> </target> <target name="run-fxcop"> <antcall target="write-head-part"/> <echo file="${dynafile.path}\${dynafilename}" append="true"> </echo> <var name="dll.names" value=""/> <foreach target="create-arguments" param="item.file" inheritall="true"> <fileset dir="${basedir}" casesensitive="no"> <include name="**/*.csproj"/> <exclude name="**/obj/Debug/**.*"/> </fileset> </foreach> <antcall target="write-footer-part"/> <subant target="run-fx-cop-report-creation"> <fileset dir="${dynafile.path}" includes="${dynafilename}"/> </subant> </target> <target name="create-arguments"> <echo message="${item.file}"/> <basename property="filename" file="${item.file}"/> <loadfile srcfile="${item.file}" property="output.path"> <filterchain> <linecontains> <contains value="&lt;OutputPath&gt;"/> </linecontains> </filterchain> </loadfile> <loadfile srcfile="${item.file}" property="output.type"> <filterchain> <linecontains> <contains value="&lt;OutputType&gt;"/> </linecontains> </filterchain> </loadfile> <loadfile srcfile="${item.file}" property="assembly.name"> <filterchain> <linecontains> <contains value="&lt;AssemblyName&gt;"/> </linecontains> </filterchain> </loadfile> <propertyregex property="output.path.info" input="${output.path}" regexp="&lt;OutputPath&gt;(.*?)&lt;/OutputPath&gt;" select="\1" /> <propertyregex property="output.type.info" input="${output.type}" regexp="&lt;OutputType&gt;(.*?)&lt;/OutputType&gt;" select="\1" /> <propertyregex property="assembly.name.info" input="${assembly.name}" regexp="&lt;AssemblyName&gt;(.*?)&lt;/AssemblyName&gt;" select="\1" /> <propertyregex property="item.path" input="${item.file}" regexp="(.*)\\" select="\1" /> <echo message="output.type.info = ${output.type.info}"/> <echo message="output.path = ${output.path}"/> <if> <contains string="WinExe" substring="${output.type.info}"/> <then> <property name="file.name.ext" value="${assembly.name.info}.exe"/> </then> <elseif> <contains string="Exe" substring="${output.type.info}"/> <then> <property name="file.name.ext" value="${assembly.name.info}.exe"/> </then> </elseif> <else> <property name="file.name.ext" value="${assembly.name.info}.dll"/> </else> </if> <echo file="${dynafile.path}\${dynafilename}" append="true"> &lt;arg value="/f:${item.path}\${output.path.info}${file.name.ext}"/&gt; </echo> </target> <target name="write-head-part"> <echo file="${dynafile.path}\${dynafilename}">&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;project name="dyna-fxcop-build" default="run-fx-cop-report-creation" basedir="."&gt; &lt;target name="run-fx-cop-report-creation"&gt; &lt;exec executable="${fxcop.path}\FxCopCmd.exe" failonerror="false"&gt;</echo> </target> <target name="write-footer-part"> <echo file="${dynafile.path}\${dynafilename}" append="true"> &lt;arg value="/r:${fxcop.path}\Rules"/&gt; &lt;arg value="/o:${fxcop.report.full.path}"/&gt; &lt;/exec&gt; &lt;/target&gt; &lt;/project&gt;</echo> </target> </project> 

Source: https://habr.com/ru/post/In149406/


All Articles