Code Linker creates links in the destination .csproj
project file to the code files in the source .csproj
, automating the process of adding existing files as-a-link into the destination project. The files are added as relative paths (back to the original) if they are already relative links. If they were originally absolute paths then that is preserved. If they already have a link I'll try not to break it.
The original version 1 was a fustercluck example of YAGNI. It is still in the repo to serve as a warning to others. CodeLinker2 is the one you want. Here is how that works ....
Links Source code in CSPROJ and/or VBPROJ files to outside projects
Does NOT Convert C# / VB between CSPROJ and VBPROJ files.
Don't cross the streams.
Anywhere this mentions CSPROJ
it also means VBPROJ
.
-
CodeLinker.exe /?
this help file -
CodeLinker.exe
[Destination.csproj]
-
Destination.csproj
Path to the existing Destination project. -
Wrap paths in your call to
CodeLinker.exe
with spaces in "double quotes". -
Paths can (probably should!) be
..\
relative.
CodeLinker puts your linked code between these 2 XML comment placeholders in the Destination CSPROJ file ...
<!-- CodeLinker
Source: PathTo\NameOfProject.csproj <== this is NOT optional
Exclude: PathTo\FileToBeExcluded.cs <== optional - a partial match will exclude it. Works like wildcard in DOS
Include: PathTo\FileToBeIncluded.cs <== optional but if used it ONLY includes matches. Works like wildcard in DOS
DestinationProjectFolderPrefix: Folder\For\Linked\Codez <== optional folder to nest linked code in
Source: PathTo\NameOfOtherProject.csproj <== this is NOT optional ... unless you don't want more projects
Exclude: PathTo\FileToBeExcluded.cs <== optional - a partial match will exclude it. Works like wildcard in DOS
Include: PathTo\FileToBeIncluded.cs <== optional but if used it ONLY includes matches. Works like wildcard in DOS
DestinationProjectFolderPrefix: Folder\For\Linked\Codez <== optional folder to nest linked code in
-->
<!-- EndCodeLinker -->
- If your destination project doesn't have the placeholders then it soon will, I will add them for you on the first run.
- You can wrap the
Source:
paths in quotes if you like, it doesn't matter. - You can have multiple source projects filtered with multiple Exclusions &/or Inclusions.
- You may specify multiple Exclude: &/or Include: items. They all apply ONLY to the Source Project immediately preceding it.
- For multiple
Source:
projects you need to re-specify anyExclude:
orInclude:
orDestinationProjectFolderPrefix:
, these are reset when you start a newSource:
project group.
You could also consider manually adding something like this to your target csproj
file ...
<PropertyGroup>
<PostBuildEvent>"Path \\ to \\\\ CodeLinker.exe" $(ProjectPath)</PostBuildEvent>
<RunPostBuildEvent>Always</RunPostBuildEvent>
</PropertyGroup>
...so it runs on every build. Why? Well, it you change the source project and add / remove / move things in the source then your target build may break until the code is re-linked and the source changes propagated to the target. If you already have a <PostBuildEvent>
then add it to that because each new one supersedes any existing one. I use a batch file, as per below.
You can put CodeLinker in the same places as your target projects or in one place for all projects. Its location will affect the log file more than anything else, the log is always in the same folder as CodeLinker.exe
.
If CodeLinker runs and nothing changes it won't re-save your Target csproj
file. If it does change the project then Visual Studio will complain loudly and want you to reload it. This is normal, don't panic
To populate the information, edit your project file in a text editor. Have no fear, Git is your friend.
- You may specify multiple Source: projects. No wildcards. Remeber to group the Include, Exclude etc together with the project
- just the File name if it's in the same folder, or relative or absolute path.
- You may specify multiple
Exclude:
&/orInclude:
items. They all apply ONLY to the immediately preceding source project - In/Exclusions are a simple VB LIKE String wildcard match, same as file system wildcard matches so * and ? work
- Protip:
Folder\OtherFolder\*
is a valid wildcard Exclusions
override allInclusions
.- If you specify no
Inclusions
then everything is anInclusion
. - If you do specify any
Inclusions
then ONLY they areIncluded
. - Multiple
Source:
orExclude:
orInclude:
are ok - they must be on separate lines. Source:
project order matters, CodeLinker will not add a link to a file path that already exists in the Destination project.In/Exclude:
order doesn't matter.- the
Source:
line needs to be before any anyExclude:
orInclude:
orDestinationProjectFolderPrefix:
lines for that project.
The folder structures of the Source(s) are preserved. If the source file is nested, the link will be nested
- soooo, if you nest them inside a folder in the source project they will all be neatly inside a nested folder in the destination project
- Every run of ProjectLinker will re-Link the source project(s) into their space between the XML comment placeholders.
- so ALL code links inside the placeholders are refreshed every time. OK?
- you can use
DestinationProjectFolderPrefix:
to nest your linked project under a parent folder
add the CodeLinker.exe to your project can call it in our post-build commands with something like...
CodeLinker.exe \"Path\\to\\Your.csproj\"
There is a log file called CodeLinkerLog.txt saved in the same folder as the executable. If you use this as a pre/post-build process The Visual Studio output window will have summary information, the details will be in the log file. Good luck finding anything in the VS output window anyway
left as an example of what happens when you think about something too much....
See the Wiki for more detailed info.
... actually, don't - it's confusing.
There's a page on the GUI app and one for the Command line app. Avoid those pages, they are for the old version.
More instructions coming soon (ok, who are we kidding here, this is OSS). Your feedback would be more than welcome.