{"id":17835749,"url":"https://github.com/guitarrapc/csprojeditor","last_synced_at":"2025-03-19T17:30:54.133Z","repository":{"id":143436054,"uuid":"175279648","full_name":"guitarrapc/CsProjEditor","owner":"guitarrapc","description":"csproj editor","archived":false,"fork":false,"pushed_at":"2020-08-08T13:41:27.000Z","size":312,"stargazers_count":9,"open_issues_count":1,"forks_count":1,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-03-08T07:37:04.501Z","etag":null,"topics":["csproj","csproj-tooling","dotnet-global-tool"],"latest_commit_sha":null,"homepage":null,"language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/guitarrapc.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-03-12T19:06:17.000Z","updated_at":"2024-06-03T21:41:15.000Z","dependencies_parsed_at":null,"dependency_job_id":"d28334b1-60b6-42bf-b4aa-38d5e0f17bee","html_url":"https://github.com/guitarrapc/CsProjEditor","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/guitarrapc%2FCsProjEditor","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/guitarrapc%2FCsProjEditor/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/guitarrapc%2FCsProjEditor/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/guitarrapc%2FCsProjEditor/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/guitarrapc","download_url":"https://codeload.github.com/guitarrapc/CsProjEditor/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244006290,"owners_count":20382443,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["csproj","csproj-tooling","dotnet-global-tool"],"created_at":"2024-10-27T20:26:00.723Z","updated_at":"2025-03-19T17:30:54.126Z","avatar_url":"https://github.com/guitarrapc.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"## CsProjEditor\n\n[![Build Status](https://cloud.drone.io/api/badges/guitarrapc/CsProjEditor/status.svg)](https://cloud.drone.io/guitarrapc/CsProjEditor) [![codecov](https://codecov.io/gh/guitarrapc/CsProjEditor/branch/master/graph/badge.svg)](https://codecov.io/gh/guitarrapc/CsProjEditor) [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)\n\n[![NuGet](https://img.shields.io/nuget/v/CsProjEditor.svg?label=CsProjEditor%20nuget)](https://www.nuget.org/packages/CsProjEditor) [![NuGet](https://img.shields.io/nuget/v/csprojcli.svg?label=csprojcli%20nuget)](https://www.nuget.org/packages/csprojcli)\n\nThis library offers csproj element/attribute operation without EnvDTE.\n\nLoad csproj file and create virtual dom, operate and write it out.\n\n## Motivation\n\nWhen I want to edit csproj for dynamically generated csproj or vscproj, like Unity UWP generates, publish-store required me to operate with Visual Studio.\nThis tools is for this dynamically operate csproj on CI or automation platform.\n\n## Limitation\n\n* Accept only utf8 and utf8bom encodings.\n* Accept only file path or stream. (no parsing string.)\n\n## Install\n\n[NuGet Library](https://www.nuget.org/packages/CsProjEditor/)\n\n```bash\ndotnet add package CsProjEditor\n```\n\n[CLI (.NET Global Tool)](https://www.nuget.org/packages/csprojcli/)\n\n```bash\ndotnet tool install -g csprojcli\n```\n\n## NuGet Usage\n\nLoad your csproj from path or Stream, then operate node and attribute!\n\n```chsarp\n// load csproj\nvar csproj = CsprojEditor.Load(\"your.csproj\");\n\n// edit\ncsproj.SetNodeValue(\"PropertyGroup\", \"PackageCertificateKeyFile\", pfx);\ncsproj.InsertNode(\"PropertyGroup\", \"PackageCertificateThumbprint\", thumbprint);\ncsproj.InsertNode(\"PropertyGroup\", \"GenerateAppInstallerFile\", \"False\");\ncsproj.InsertNode(\"PropertyGroup\", \"AppxAutoIncrementPackageRevision\", \"True\");\ncsproj.InsertNode(\"PropertyGroup\", \"AppxSymbolPackageEnabled\", \"False\");\ncsproj.InsertNode(\"PropertyGroup\", \"AppxBundle\", \"Always\");\ncsproj.InsertNode(\"PropertyGroup\", \"AppxBundlePlatforms\", \"x86\");\ncsproj.InsertNode(\"PropertyGroup\", \"AppInstallerUpdateFrequency\", \"1\");\ncsproj.InsertNode(\"PropertyGroup\", \"AppInstallerCheckForUpdateFrequency\", \"OnApplicationRun\");\ncsproj.InsertAttribute(\"ItemGroup\", \"None\", \"Include\", pfx, e =\u003e !e.HasAttributes);\ncsproj.InsertAttribute(\"ItemGroup\", \"None\", \"Include\", \"Package.StoreAssociation.xml\", e =\u003e !e.HasAttributes);\n\n// save\ncsproj.Save(path);\n```\n\nmore examples? check [examples](https://github.com/guitarrapc/CsProjEditor/tree/master/examples/CsProjEditorSample) and [test](https://github.com/guitarrapc/CsProjEditor/tree/master/tests/CsProjEditor.Tests).\n\n## CLI Usage\n\nYou can find help.\n\n```\n\u003e csprojcli help\n```\n\nYou can run for each operation for `group.*`, `node.*`, `nodevalue.*`, `attrribute.*` and `attributevalue.*`.\n\nhere's all commands and examples, you can reproduce with commands running at `examples/csprojcli`.\n\n```\nUsage: csprojcli [version] [help] [batch.loadandrun|batch.run|groups.get|group.get|group.exists|group.insert|group.replace|group.remove|nodes.get|node.get|node.exists|node.insert|node.replace|node.remove|nodevalue.get|nodevalue.exists|nodevalue.set|nodevalue.append|nodevalue.prepend|nodevalue.replace|nodevalue.remove|attribute.get|attribute.exists|attribute.insert|attribute.replace|attribute.remove|attributevalue.get|attributevalue.exists|attributevalue.set|attributevalue.append|attributevalue.prepend|attributevalue.replace|attributevalue.remove] [parameters]\n\nE.g., run this for Batch execution. see JSON sample at https://raw.githubusercontent.com/guitarrapc/CsProjEditor/master/src/csprojcli/sample.json\n--------------------------\n$ csprojcli batch.loadandrun -jsonPath examples/csprojcli/uwp_storepublish.json\n$ csprojcli batch.run -json JSON\n\nE.g., run this for group execution.:\n--------------------------\n$ csprojcli groups.get -p SimpleNewCsProjUtf8_CRLF.csproj\n$ csprojcli group.get -p SimpleNewCsProjUtf8_CRLF.csproj -g PropertyGroup\n$ csprojcli group.exists -p SimpleNewCsProjUtf8_CRLF.csproj -g PropertyGroup\n$ csprojcli group.insert -p SimpleNewCsProjUtf8_CRLF.csproj -g PropertyGroup -output result_SimpleNewCsProjUtf8_CRLF.csproj -allowoverwrite true\n$ csprojcli group.replace -p SimpleNewCsProjUtf8_CRLF.csproj -g PropertyGroup -pattern Property -replacement Foo -output result_SimpleNewCsProjUtf8_CRLF.csproj -allowoverwrite true\n$ csprojcli group.remove -p SimpleNewCsProjUtf8_CRLF.csproj -g PropertyGroup -output result_SimpleNewCsProjUtf8_CRLF.csproj -allowoverwrite true\n\nE.g., run this for node execution.:\n--------------------------\n$ csprojcli nodes.get -p SimpleNewCsProjUtf8_CRLF.csproj -g PropertyGroup\n$ csprojcli node.get -p SimpleNewCsProjUtf8_CRLF.csproj -g PropertyGroup -n TargetFramework\n$ csprojcli node.exists -p SimpleNewCsProjUtf8_CRLF.csproj -g PropertyGroup -n TargetFramework\n$ csprojcli node.insert -p SimpleNewCsProjUtf8_CRLF.csproj -g PropertyGroup -n PackageCertificateThumbprint -v 1234567890ABCDEF -output result_SimpleNewCsProjUtf8_CRLF.csproj -allowoverwrite true\n$ csprojcli node.replace -p SimpleNewCsProjUtf8_CRLF.csproj -g PropertyGroup -n LangVersion -pattern latest -replacement preview -output result_SimpleNewCsProjUtf8_CRLF.csproj -allowoverwrite true\n$ csprojcli node.remove -p SimpleNewCsProjUtf8_CRLF.csproj -g PropertyGroup -n LangVersion -output result_SimpleNewCsProjUtf8_CRLF.csproj -allowoverwrite true\n\nE.g., run this for node value execution.:\n--------------------------\n$ csprojcli nodevalue.get -p SimpleNewCsProjUtf8_CRLF.csproj -g PropertyGroup -n TargetFramework\n$ csprojcli nodevalue.exists -p SimpleNewCsProjUtf8_CRLF.csproj -g PropertyGroup -n TargetFramework -v netstandard2.0\n$ csprojcli nodevalue.set -p SimpleNewCsProjUtf8_CRLF.csproj -g PropertyGroup -n PackageCertificateKeyFile -v hogehoge.pfx -output result_SimpleNewCsProjUtf8_CRLF.csproj -allowoverwrite true\n$ csprojcli nodevalue.append -p SimpleNewCsProjUtf8_CRLF.csproj -g PropertyGroup -n RootNamespace -v SimpleCsProj -append ect -output result_SimpleNewCsProjUtf8_CRLF.csproj -allowoverwrite true\n$ csprojcli nodevalue.prepend -p SimpleNewCsProjUtf8_CRLF.csproj -g PropertyGroup -n RootNamespace -v SimpleCsProj -prepend Very -output result_SimpleNewCsProjUtf8_CRLF.csproj -allowoverwrite true\n$ csprojcli nodevalue.replace -p SimpleNewCsProjUtf8_CRLF.csproj -g PropertyGroup -n OutputType -v Exe -pattern Exe -replacement AppContainer -output result_SimpleNewCsProjUtf8_CRLF.csproj -allowoverwrite true\n$ csprojcli nodevalue.remove -p SimpleNewCsProjUtf8_CRLF.csproj -g PropertyGroup -n AssemblyName -v SimpleCsProj -output result_SimpleNewCsProjUtf8_CRLF.csproj -allowoverwrite true\n\nE.g., run this for group attribute execution.:\n--------------------------\n$ csprojcli attribute.get -p SimpleNewCsProjUtf8_CRLF.csproj -g Import\n$ csprojcli attribute.exists -p SimpleNewCsProjUtf8_CRLF.csproj -g Import -a Include\n$ csprojcli attribute.insert -p SimpleNewCsProjUtf8_CRLF.csproj -g Import -a Include -v example.json -output result_SimpleNewCsProjUtf8_CRLF.csproj -allowoverwrite true\n$ csprojcli attribute.insert -p SimpleNewCsProjUtf8_CRLF.csproj -g Import -a Project,Condition -v \".pack\\\\package.csproj\",\"Exists('.pack\\\\package.csproj')\" -output result_SimpleNewCsProjUtf8_CRLF.csproj -allowoverwrite true\n$ csprojcli attribute.remove -p SimpleNewCsProjUtf8_CRLF.csproj -g Import -a Exclude -output result_SimpleNewCsProjUtf8_CRLF.csproj -allowoverwrite true\n\nE.g., run this for node attribute execution.:\n--------------------------\n$ csprojcli attribute.get -p SimpleNewCsProjUtf8_CRLF.csproj -g ItemGroup -n None\n$ csprojcli attribute.exists -p SimpleNewCsProjUtf8_CRLF.csproj -g ItemGroup -n None -a Include\n$ csprojcli attribute.insert -p SimpleNewCsProjUtf8_CRLF.csproj -g ItemGroup -n None -a Include -v example.json -output result_SimpleNewCsProjUtf8_CRLF.csproj -allowoverwrite true\n$ csprojcli attribute.replace -p SimpleNewCsProjUtf8_CRLF.csproj -g ItemGroup -n None -a Include -v project.json -pattern None -replacement Content -output result_SimpleNewCsProjUtf8_CRLF.csproj -allowoverwrite true\n$ csprojcli attribute.remove -p SimpleNewCsProjUtf8_CRLF.csproj -g ItemGroup -n None -a Exclude -output result_SimpleNewCsProjUtf8_CRLF.csproj -allowoverwrite true\n\nE.g., run this for attribute value execution.:\n--------------------------\n$ csprojcli attributevalue.get -p SimpleNewCsProjUtf8_CRLF.csproj -g ItemGroup -n None -a Include\n$ csprojcli attributevalue.exists -p SimpleNewCsProjUtf8_CRLF.csproj -g ItemGroup -n Compile -a Include -v App.cs\n$ csprojcli attributevalue.set -p SimpleNewCsProjUtf8_CRLF.csproj -g Target -n Message -a Importance -v low - -output result_SimpleNewCsProjUtf8_CRLF.csproj -allowoverwrite true\n$ csprojcli attributevalue.append -p SimpleNewCsProjUtf8_CRLF.csproj -g ItemGroup -n None -a Include -v project.json -append ect -output result_SimpleNewCsProjUtf8_CRLF.csproj -allowoverwrite true\n$ csprojcli attributevalue.prepend -p SimpleNewCsProjUtf8_CRLF.csproj -g ItemGroup -n None -a Include -v project.json -prepend Very -output result_SimpleNewCsProjUtf8_CRLF.csproj -allowoverwrite true\n$ csprojcli attributevalue.replace -p SimpleNewCsProjUtf8_CRLF.csproj -g ItemGroup -n None -a Include -v project.json -pattern project -replacement example -output result_SimpleNewCsProjUtf8_CRLF.csproj -allowoverwrite true\n$ csprojcli attributevalue.remove -p SimpleNewCsProjUtf8_CRLF.csproj -g ItemGroup -n None -a Include -v project.json -output result_SimpleNewCsProjUtf8_CRLF.csproj -allowoverwrite true\n```\n\nEach command require `save` to overlap previous command execution result, you can do by passing `-dry false` and `-allowoverwrite true`.\n\n```\ncsprojcli nodevalue.set -p \"test.csproj\" -g PropertyGroup -n PackageCertificateKeyFile -v hogehoge.pfx -output \"result.csproj\" -allowoverwrite true\ncsprojcli node.insert -p \"result.csproj\" -g PropertyGroup -n PackageCertificateThumbprint -v 1234567890ABCDEF -output \"result.csproj\" -allowoverwrite true\n```\n\n![](docs/csprojcli_each_sample.png)\n\n\nAlso, you can define commands in JSON and batch execute it with `batch.loadandrun`.\nThis will execute defined commands and save, or show dry-run, when everything goes fine.\n\n```\ncsprojcli batch.loadandrun -jsonPath your_commands.json\n```\n\njson should follow to [Scheme](https://github.com/guitarrapc/CsProjEditor/blob/master/src/csprojcli/scheme.json) and here' [all command sample JSON](https://github.com/guitarrapc/CsProjEditor/blob/master/src/csprojcli/sample.json).\n\n![](docs/csprojcli_batch_sample.png)\n\nmore examples? check [examples](https://github.com/guitarrapc/CsProjEditor/tree/master/examples/csprojcli).\n\n## Implementations\n\n* [x] File: Load\n* [x] File: ToString override.\n* [x] File: Detect UTF8 Bom.\n* [x] File: Detect EOL.\n* [x] File: Save with original utf8 encoding, keep BOM.\n* [x] File: Save will add empty line if last line is value.\n* [x] XmlUtils: Get NameSpace (for old csproj, equivalent for new csproj)\n* [x] XmlUtils: Get Declaration (for old csproj, equivalent for new csproj)\n* [x] XmlUtils: Get space for each node\n* [x] Filter: filter node, nodevalue and attribute and pass as XElement\n* [x] Group: Get (Groups)\n* [x] Group: Exists\n* [x] Group: Insert\n* [x] Group: Remove\n* [x] Group: Replace\n* [x] Node: Get (Nodes)\n* [x] Node: Exists\n* [x] Node: Insert\n* [x] Node: Remove\n* [x] Node: Replace\n* [x] NodeValue: Get\n* [x] NodeValue: Exists\n* [x] NodeValue: Set\n* [x] NodeValue: Append\n* [x] NodeValue: Prepend\n* [x] NodeValue: Remove\n* [x] NodeValue: Replace\n* [x] Attribute: Get (Group)\n* [x] Attribute: Get (Node)\n* [x] Attribute: Exists (Group)\n* [x] Attribute: Exists (Node)\n* [x] Attribute: Insert (Group)\n* [x] Attribute: Insert (Node)\n* [x] Attribute: Set (Group)\n* [x] Attribute: Set (Node)\n* [x] Attribute: Remove (Group)\n* [x] Attribute: Remove (Node)\n* [x] Attribute: Replace (Group)\n* [x] Attribute: Replace (Node)\n* [ ] AttributeValue: Get (Group)\n* [x] AttributeValue: Get (Node)\n* [ ] AttributeValue: Exists (Group)\n* [x] AttributeValue: Exists (Node)\n* [ ] AttributeValue: Set (Group)\n* [x] AttributeValue: Set (Node)\n* [ ] AttributeValue: Append (Group)\n* [x] AttributeValue: Append (Node)\n* [ ] AttributeValue: Prepend (Group)\n* [x] AttributeValue: Prepend (Node)\n* [ ] AttributeValue: Remove (Group)\n* [x] AttributeValue: Remove (Node)\n* [ ] AttributeValue: Replace (Group)\n* [x] AttributeValue: Replace (Node)\n* [x] Tests: Node\n* [x] Tests: NodeValue\n* [x] Tests: Attribute (Group)\n* [x] Tests: Attribute (Node)\n* [x] Tests: AttributeValue\n* [x] Tests: Save\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fguitarrapc%2Fcsprojeditor","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fguitarrapc%2Fcsprojeditor","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fguitarrapc%2Fcsprojeditor/lists"}